MySQL 的 EXPLAIN 命令可以查看SELECT语句的执行的计划,是 MySQL 查询优化的必备工具。
通过执行计划可以了解查询方式、索引使用情况、需要扫描的数据量以及是否需要临时表或排序操作等信息。
我们需要分析执行计划对查询进行有的放矢的优化。
需要注意:
EXPLAIN不考虑触发器、存储过程或用户自定义函数对查询的影响
EXPLAIN不考虑缓存
EXPLAIN只能分析执行计划,不能显示存储引擎在执行查询过程中进行的操作
部分统计信息是估算的,并非精确值
本文基于 MySQL 5.6 版本。
EXPLAIN SELECT * FROM `user` JOIN `post` ON `user`.id = `post`.uid WHERE user.`created_at` < '2018-10-01 00:00:00' AND `post`.status = 1;结果:
id select_type table type possible_keys key key_len ref rows Extra1 SIMPLE user range PRIMARY,idx_created_at idx_created_at 7 null 19440 Using index condition; Using where; Using temporary; Using filesort
1 SIMPLE post ref idx_uid,idx_status idx_uid 8 user.id 1 Using where
EXPLAIN 的行数为查询涉及的表数, 结果各列的含义为:
id: 查询的唯一标识
select_type: 查询的类型
table: 查询的表, 可能是数据库中的表/视图,也可能是 FROM 中的子查询
type: 搜索数据的方法
possible_keys: 可能使用的索引
key: 最终决定要使用的key
key_len: 查询索引使用的字节数。通常越少越好
ref: 查询的列或常量
rows: 需要扫描的行数,估计值。通常越少越好
extra: 额外的信息