查询操作是数据库最主要的负载来源,因此优化查询效率是提升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 首先我们先准备一张表格:
1.2 进入客户端命令行 输入:
EXPLAIN SELECT * FROM dotcpp_ser;
结果:
参数的基本意义:
参数 | 说明 |
---|---|
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 与 EXPLAIN 查询效果大同小异
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程