EXPLAIN
语句中的type
列指定了MySQL查询执行时访问表的不同方式。每种类型的访问方式对查询性能有着不同的影响。下面是常见的type
值及其含义:
1. ALL (全表扫描)
- 描述:全表扫描,意味着MySQL需要扫描整个表来查找匹配的行。
- 性能:这是最差的一种情况,因为它需要扫描整个表。
- 示例:
EXPLAIN SELECT * FROM table_name;
2. index (索引全扫描)
- 描述:索引全扫描,意味着MySQL使用索引来扫描所有的行。
- 性能:比全表扫描好一些,但如果索引很长,仍然不是很好。
- 示例:
EXPLAIN SELECT * FROM table_name ORDER BY indexed_column;
3. range (范围扫描)
- 描述:范围扫描,MySQL会使用索引查找一个值范围内的行。
- 性能:通常比较好,因为只需要扫描索引的一部分。
- 示例:
EXPLAIN SELECT * FROM table_name WHERE indexed_column BETWEEN value1 AND value2;
4. index_subscan (索引子扫描)
- 描述:在使用覆盖索引时,MySQL会首先使用索引查找数据,然后根据索引再次查找实际的数据行。
- 性能:通常比较好,因为减少了数据行的查找次数。
- 示例:
EXPLAIN SELECT indexed_column FROM table_name WHERE indexed_column = value;
5. ref (普通索引扫描)
- 描述:使用一个索引列的值来查找另一索引列的值。
- 性能:相对较好,因为使用了索引。
- 示例:
EXPLAIN SELECT * FROM table_name WHERE indexed_column = value;
6. eq_ref (相等引用)
- 描述:通常发生在连接中,当使用索引列与另一个表的主键或唯一索引相等时。
- 性能:非常好,因为只需要查找一次。
- 示例:
EXPLAIN SELECT * FROM table_a JOIN table_b ON table_a.id = table_b.id;
7. const (常量)
- 描述:MySQL使用常量值来查找行,通常用于单行记录的查找。
- 性能:非常好,因为只需要查找一次。
- 示例:
EXPLAIN SELECT * FROM table_name WHERE primary_key = value;
8. system (单行表)
- 描述:当表中只有单行数据时,系统会把它当作常量表处理。
- 性能:非常好,因为只需要查找一次。
- 示例:
EXPLAIN SELECT * FROM (SELECT 1) AS single_row;
9. NULL (无索引)
- 描述:没有使用索引的情况,通常发生在不需要访问表的情况,如查询常量或表达式。
- 性能:视具体情况而定。
- 示例:
EXPLAIN SELECT 1;
10. fulltext (全文索引)
- 描述:使用全文索引进行查询。
- 性能:对于全文索引查询来说,性能通常不错。
- 示例:
EXPLAIN SELECT * FROM table_name WHERE MATCH(indexed_column) AGAINST('search text');
总结
type
值反映了MySQL执行查询时访问表的方式,从性能角度来看,const
和eq_ref
是最好的,其次是ref
和range
。ALL
是最差的访问类型,因为它需要扫描整个表。通过分析EXPLAIN
输出中的type
值,可以评估查询的性能,并据此优化查询或调整索引策略。