通过 EXPLAIN 你可以知道:如是否使用索引、扫描多少行、是否需要排序或临时表
EXPLAIN 三板斧(type、key、Extra)
例子:
explain select * from user where 'name' = '小明'
type 访问类型
性能高到低
表示 MySQL 是如何查找表中的数据,怎么做数据检索的,是查询性能的关键指标
性能从高到低排序:
system > const > eq_ref > ref > range > index > ALL
- system:表仅有一行数据(系统表或单行表),这是 const 的特例
- const:通过主键或唯一索引查找,且查询条件是常量,性能极高,因为直接定位到单行数据
- eq_ref:在多表连接(JOIN)中,通过主键或唯一索引进行等值匹配,每行只匹配一行数据,性能非常高,逐行精确匹配
- ref:表示使用了非唯一的索引(普通索引),或者唯一索引的前缀进行等值匹配
- range:通过索引进行范围扫描,返回符合条件的行(如 BETWEEN、>、< 等),性能中等,优于全表扫描但不如等值匹配
- index:进行了全索引扫描,扫描整个索引树而不是表数据。只遍历索引树,不访问数据文件。
- all:表示全表扫描,未使用索引
多注意
type 如果是从 range 以及一下就需要多留意关注了
type: index 出现的场景
- 查询字段完全被索引覆盖
- 复合索引覆盖查询字段和条件
key 实际使用的索引
key 会显示你使用的索引名
如果没用索引,那么这里会显示 NULL
Extra 额外信息
Using index: 表示使用了 覆盖索引(Covering Index),即查询的所有字段都在索引中,无需回表(性能最佳)
Using where: 表示存储引擎返回数据后,MySQL 服务器层需要再次过滤数据(可能需优化)
Using filesort: 表示需要文件排序(性能较差,需避免)
Using temporary: 表示需要创建临时表(性能差,需优化)
其他字段
select_type:查询的类型或复杂性,描述查询的结构(如简单查询、子查询、联合查询等)
possible_keys:查询可能使用的索引列表(可能,但不一定实际使用)
ref:显示索引的哪一列被使用,以及与之比较的值(如常量、列名),const,表示使用了等值匹配
rows:MySQL 估计需要扫描的数据行数(估算值),注意不是扫描是索引树中的数据条数
filtered:剩余满足查询条件的记录百分比