2024-04-24 19:18:10
MySQL执行计划是优化SQL性能的关键工具,通过EXPLAIN命令可以查看SQL语句的执行计划,了解MySQL如何使用索引、连接表以及查询的执行顺序。以下是EXPLAIN结果的深度解析:

在SELECT语句前加上EXPLAIN,即可得到MySQL对该查询的执行计划报告。例如:
EXPLAIN SELECT * FROM users WHERE id = 1;
EXPLAIN语句会返回多行数据,每一行代表查询中的一个操作。以下是各个字段的详细解释:
1. id:查询的标识符如果id相同,则执行顺序从上到下。
如果id不同,值越大优先级越高,越先被执行。
如果id为NULL,则表示这是一个UNION查询的结果。
SIMPLE:简单查询,不包含子查询或UNION。
PRIMARY:最外层的SELECT查询。
SUBQUERY:SELECT或WHERE列表中包含的子查询。
DERIVED:在FROM子句中出现的子查询。MySQL会将结果存放在一个临时表中,也称为派生表。
UNION:UNION语句中的第二个或后面的SELECT查询。
UNION RESULT:从UNION的临时表中检索结果。
system:表只有一行记录,是const类型的特殊情况。
const:通过主键或唯一索引一次就能找到。
eq_ref:使用唯一索引查找,常见于主键或唯一索引的关联查询。
ref:使用非唯一索引查找。
fulltext:使用全文索引。
ref_or_null:类似于ref,但是MySQL会对包含NULL值的列进行额外的搜索。
index_merge:使用了索引合并优化策略。
unique_subquery:用于替换IN子查询的一种形式,返回不重复值字段。
index_subquery:类似于unique_subquery,但返回的是非唯一值字段。
range:使用索引范围扫描。
index:全索引扫描。
ALL:全表扫描。
Using index:使用了覆盖索引,避免了回表查询。
Using where:使用了WHERE子句过滤结果。
Using temporary:MySQL需要创建临时表来存储结果,常见于ORDER BY和GROUP BY。
Using filesort:MySQL需要使用文件排序,而不是索引排序。
Using join buffer (Block Nested Loop):使用了连接缓存。
Impossible WHERE noticed after reading const tables:WHERE子句总是false,导致没有符合条件的行。
Select tables optimized away:使用了某些优化策略,例如直接从索引中获取数据,而不需要访问表。
Distinct:优化DISTINCT操作,当找到第一匹配的元组后停止搜索。
Using temporary和Using filesort通常是性能瓶颈,应该尽量避免。可以通过添加索引来优化排序。
Using index是好的,说明使用了覆盖索引。

索引失效是导致查询性能下降的常见原因。以下是一些常见的索引失效情况以及相应的应对策略:
1. WHERE子句中使用函数或表达式