MySQL 优化器简述
# Extra 字段常见含义
# 1.No tables used
- 没有表被使用,查询语句没有 FROM 子句时会出现该提示;
- 示例:
EXPLAIN SELECT 1;
。
# 2.Impossible WHERE
- 不可能的 where 语句,查询语句的 WHERE ⼦句永远为 FALSE 时将会出现该提示;
- 示例:
EXPLAIN SELECT * FROM s1 WHERE 1 != 1;
。
# 3.No matching min/max row
- 没有匹配到 min/max 行,当查询列表处有 MIN 或者 MAX 聚集函数,但是并没有符合 WHERE ⼦句中的搜索条件的记录时会出现该提示;
- 示例:
EXPLAIN SELECT MIN(key1) FROM s1 WHERE key1 = 'abcdefg';
。
# 4.Using index
- 使用索引,当查询列表以及搜索条件中只包含属于某个索引的列,也就是在可以使⽤索引覆盖而不需要回表的情况下会出现该提示;
- 示例:
EXPLAIN SELECT key1 FROM s1 WHERE key1 = 'a';
。
# 5.Using index condition
- 使用索引条件下推,如果在查询语句的执⾏过程中将要使⽤索引条件下推这个特性时会出现该提示,能够减少回表次数;
- 示例:
EXPLAIN SELECT * FROM s1 WHERE key1 > 'z' AND key1 LIKE '%b';
。
# 6.Using where
- 全表扫描且使用条件,当使⽤全表扫描来执⾏对某个表的查询,并且该语句的WHERE⼦句中有除了该索引包含的列之外的其他搜索条件时,都会出现该提示;
- 示例:
EXPLAIN SELECT * FROM s1 WHERE common_field = 'a';
,EXPLAIN SELECT * FROM s1 WHERE key1 = 'a' AND common_field = 'a';
。
# 7.Using filesort
- 使用内存或是磁盘排序,很多情况下排序操作⽆法使⽤到索引,只能在内存中(记录较少的时候)或者磁盘中(记录较多的时候)进⾏排序,统称为⽂件排序。如果某个查询需要使⽤⽂件排序的⽅式执⾏查询,就会出现该提示,文件排序比较耗时最好能优化为索引排序。
- 示例:
EXPLAIN SELECT * FROM s1 ORDER BY common_field LIMIT 10;
。
# 8.Using temporary
- 使用临时表,在许多查询的执⾏过程中,MySQL可能会借助临时表来完成⼀些功能,⽐如去重、排序之类的,⽐如我们在执⾏许多包含DISTINCT、GROUP BY、UNION等⼦句的查询过程中,如果不能有效利⽤索引来完成查询,MySQL很有可能寻求通过建⽴内部的临时表来执⾏查询,就会有该提示;
- 示例:
EXPLAIN SELECT common_field, COUNT(*) AS amount FROM s1 GROUP BY common_field;
。
编辑 (opens new window)
上次更新: 2024/10/22, 16:41:14