查询操作是数据库最主要的负载来源,因此优化查询效率是提升MySQL数据库性能最直接、最关键的途径。在《什么是MySQL的性能优化,效率低下的SQL该如何查询?》一节里我们已经知道如何精准定位效率低下的SQL语句,本小节主要向您介绍查询语句该如何理解。

分析查询语句的执行计划可定位性能瓶颈(如全表扫描、索引缺失、排序消耗等)。MySQL 提供  EXPLAIN  和  DESCRIBE (通常简写成 DESC )命令用于获取 SELECT 语句的执行信息,通过解析其返回的访问类型、索引使用、扫描行数等关键参数,为查询优化提供精确依据。( 注:DESCRIBE 与 EXPLAIN 查询效果大同小异)

EXPALIN 语句的语法如下:

EXPLAIN SELECT 语句;

“SELECT 语句”参数一般为数据库查询命令,如“SELECT * FROM table_name。通过 EXPLAIN 关键字可以分析后面 SELECT 语句的执行情况,并且能够分析出所查询表的一些内容。

例1:

我将为您演示如何使用 EXPALIN 语句来分析一个查询语句:

1.1 首先我们先准备一张表格:

dotcpp_user表格

1.2 进入客户端命令行 输入:

EXPLAIN SELECT * FROM dotcpp_ser;

结果:

EXPLAIN分析dotcpp_user表

参数的基本意义:


参数说明
id查询标识符。数字越大越先执行,相同id按顺序执行
select_type• SIMPLE:简单查询,不包含连接查询和子查询
• PRIMARY:主查询,即最外层的查询语句
• UNION:UNION操作中第二个或后面的SELECT语句
• DEPENDENT UNION:UNION中后续的SELECT语句,依赖于外部查询
• UNION RESULT:UNION操作的结果集
• SUBQUERY:子查询中的第一个SELECT语句
• DEPENDENT SUBQUERY:子查询中的第一个SELECT语句,依赖于外部查询
• DERIVED:FROM子句中的子查询(派生表查询)
table正在访问的表名称
partitions匹配的分区信息,NULL表示未分区
type• NULL:不访问表或索引,直接返回结果
• system:表只有一条记录
• const:通过索引查询单条记录
• eq_ref:多表连接时使用主键或唯一索引
• ref:多表查询时使用普通索引
• range:使用范围查询(<, >, BETWEEN等)
• index:全索引扫描
• ALL:全表扫描(性能最差)
possible_keys可能使用的索引,NULL表示无合适索引
key实际使用的索引,NULL表示未使用索引
key_len使用的索引长度,NULL表示未使用索引
ref与索引比较的列或常量,NULL表示无索引引用
rows预估扫描行数,数值越小性能越好
filtered存储引擎返回数据后,经Server层过滤的百分比
Extra额外信息:Using index(覆盖索引)、Using where(WHERE过滤)等

此时我们可以知道:这次查询正在对 dotcpp_user 表进行全表扫描type: ALL),属于性能最差的方式且没有使用任何索引key: NULL),所以MySQL 必须逐行读取全部 5 条记录(rows: 5)来获取结果。

例2:

我将为您演示如何使用 DESCRIBE 语句来分析一个查询语句:

DESCRIBE进行语句分析

说明: DESCRIBE 与 EXPLAIN 查询效果大同小异

点赞(2)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)