随笔记录
数据库查询优化-explain
2025-4-15 diaba


在 MySQL 中,EXPLAIN 是一个非常有用的命令,用于分析 SQL 查询的执行计划。通过 EXPLAIN,可以了解 MySQL 是如何执行查询的,包括表的访问顺序、使用的索引、连接类型等信息。这对于优化查询性能非常有帮助。



基本用法


EXPLAIN [SQL查询语句]; 


例如:


EXPLAIN SELECT * FROM users WHERE age > 25; 


输出字段解释



EXPLAIN 的输出结果通常包含以下字段:





  1. id




    • 查询的序列号。如果查询中包含子查询或联合查询,每个子查询或联合查询都会有一个不同的 id。一般来说,id 越小,查询的优先级越高。





  2. select_type




    • 查询的类型。常见的值包括:


      • SIMPLE:简单查询,不包含子查询或联合查询。


      • PRIMARY:最外层的查询。


      • SUBQUERY:子查询中的第一个 SELECT


      • DERIVED:派生表(子查询在 FROM 子句中)。


      • UNION:联合查询中的第二个及后续的 SELECT


      • UNION RESULT:联合查询的结果。







  3. table




    • 当前查询涉及的表名。





  4. partitions




    • 如果表被分区,显示查询涉及的分区信息。如果没有分区,该列为空。





  5. type




    • 表示 MySQL 在表中查找数据时的访问类型。常见的值包括:


      • ALL:全表扫描,性能最差。


      • index:索引全扫描,比全表扫描稍好,但仍然需要扫描整个索引。


      • range:索引范围扫描,比全索引扫描好,但仍然需要扫描部分索引。


      • ref:非唯一索引扫描,使用索引查找特定值。


      • eq_ref:唯一索引扫描,通常用于主键或唯一索引。


      • const:常量扫描,通常用于主键或唯一索引的等值查询。


      • system:表中只有一行数据,性能最好。







  6. possible_keys




    • 显示可能被查询使用的索引。如果为空,表示没有合适的索引可以使用。





  7. key




    • 实际使用的索引。如果为空,表示没有使用索引。





  8. key_len




    • 使用的索引的长度(以字节为单位)。一般来说,长度越短,索引的效率越高。





  9. ref




    • 显示索引的哪一列被用于比较。如果是 const,表示使用了常量值。





  10. rows




    • 估计需要扫描的行数。这个值越小,查询性能越好。





  11. filtered




    • 表示通过条件过滤后的行数比例(以百分比表示)。值越接近 100,表示过滤效果越好。





  12. Extra




    • 包含额外的信息,帮助理解 MySQL 是如何执行查询的。常见的值包括:


      • Using index:表示使用了覆盖索引,不需要回表查询。


      • Using where:表示使用了 WHERE 子句过滤数据。


      • Using temporary:表示需要创建临时表来存储中间结果。


      • Using filesort:表示需要进行文件排序操作,性能较差。


      • Using join buffer:表示使用了连接缓冲区。


      • Impossible WHERE:表示 WHERE 子句的条件永远不成立。







示例



假设有一个 users 表,包含以下字段:


CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(50),
INDEX idx_age (age)
);


执行以下查询:


EXPLAIN SELECT * FROM users WHERE age > 25; 


可能的输出结果如下:




































id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1

SIMPLE

users

NULL

range

idx_age

idx_age

4

NULL

100

100.00

Using where


解释:




如何优化查询





  1. 检查索引




    • 确保查询中使用了合适的索引。如果 possible_keys 和 key 都为空,表示没有使用索引,需要考虑添加索引。





  2. 减少扫描行数




    • 尽量减少 rows 的值。可以通过优化查询条件或调整索引结构来实现。





  3. 避免全表扫描




    • 如果 type 是 ALL,表示进行了全表扫描,性能较差。尽量通过索引优化查询。





  4. 减少临时表和文件排序




    • 如果 Extra 中包含 Using temporary 或 Using filesort,表示查询性能较差。可以通过优化查询或调整索引结构来避免这些操作。





  5. 覆盖索引




    • 如果查询的字段都在索引中,MySQL 可以直接使用索引返回结果,而不需要回表查询。这种情况下,Extra 中会显示 Using index





通过 EXPLAIN 命令,可以深入了解 MySQL 的查询执行计划,从而优化查询性能。

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容