EXPLAIN是分析MySQL查询执行计划的关键命令,通过在SELECT、UPDATE等语句前添加EXPLAIN可查看其执行过程。输出字段中,id表示查询标识符,select_type显示查询类型如SIMPLE或PRIMARY,table为涉及的表名,type反映访问类型,理想为const或range,避免ALL全表扫描。possible_keys和key分别指出可能使用和实际使用的索引,key_len显示索引长度,ref标识被引用的列或常量,rows为扫描行数估算值,filtered表示过滤后的行比例,Extra提供额外信息如Using index(覆盖索引)或Using filesort(需排序)。例如对users表执行EXPLAIN SELECT name FROM users WHERE age > 30 AND city = 'Beijing',若type为range且key使用idx_age_city联合索引,则性能较优;否则可添加复合索引优化。MySQL 5.6+支持EXPLAIN FORMAT=JSON获取更详细信息,MySQL 8.0+引入EXPLAIN ANALYZE实际执行并返回真实耗时,有助于精准调优。掌握EXPLAIN有助于识别全表扫描、缺失索引等问题,进而优化SQL性能。

在 MySQL 中,EXPLAIN 是一个非常实用的命令,用于分析 SQL 查询的执行计划。通过它,你可以了解 MySQL 如何执行某条 SELECT、UPDATE、DELETE 或 INSERT 语句,从而判断是否存在性能瓶颈,比如全表扫描、缺少索引、错误的连接顺序等。
只需在 SQL 语句前加上 EXPLAIN 关键字:
EXPLAIN SELECT * FROM users WHERE id = 1;
执行后会返回一个结果集,每一列表示查询执行过程中的某个信息项。
以下是常见列及其含义:
id: 查询的标识符。如果存在子查询或联合查询,每个部分都有一个 ID,ID 相同的执行顺序从上到下,ID 越大越先执行。
select_type: 查询类型,常见值包括:
table: 查询涉及的表名。如果是派生表,会显示为 <derived2> 这类格式。
partitions: 匹配的分区(如果使用了分区表),一般为空表示未分区。
type: 表的访问类型,这是判断查询性能的关键指标,从最优到最差:
possible_keys: 可能使用的索引。如果为 NULL,说明没有相关索引可用。
key: 实际使用的索引。如果为 NULL,表示未使用索引。
key_len: 使用索引的长度(字节)。可用于判断复合索引的使用情况。例如,INT 类型通常占 4 字节,VARCHAR(255) 在 utf8mb4 下最多占 1020 字节。
ref: 显示索引哪一列被使用了,或者是一个常量值(如 const)。
rows: 扫描的行数估算值。这个值越小越好。注意是“估算”,不一定精确。
filtered: 表示经过 WHERE 条件过滤后剩余的行百分比(基于统计信息估算)。100 表示全部保留,10 表示只剩 10%。
Extra: 额外信息,非常重要,常见值有:
假设有一个用户表:
CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), age INT, city VARCHAR(50), INDEX idx_age (age), INDEX idx_city (city) );
执行:
EXPLAIN SELECT name FROM users WHERE age > 30 AND city = 'Beijing';
观察输出:
优化建议:添加联合索引:
ALTER TABLE users ADD INDEX idx_age_city (age, city);
再次执行 EXPLAIN,观察 key 是否变为 idx_age_city,type 是否为 range,Extra 是否减少 filesort 或 temporary。
MySQL 5.6+ 支持 EXPLAIN FORMAT=JSON,提供更详细的执行计划,包括成本估算、索引使用细节等:
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE age > 30;
此外还有 EXPLAIN ANALYZE(MySQL 8.0+),它会实际执行 SQL 并返回真实耗时信息,比普通 EXPLAIN 更准确。
用法:
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;
注意:ANALYZE 会真正执行语句,写操作需谨慎。
EXPLAIN 是 SQL 性能调优的起点。重点关注 type(避免 ALL)、key(是否命中索引)、rows(扫描行数)和 Extra(避免 temporary、filesort)。结合业务场景不断调整索引结构,才能写出高效的 SQL。
基本上就这些,掌握 EXPLAIN 后,SQL 优化就有了方向。
以上就是mysql如何使用explain分析SQL的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号