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执行查询时访问表的方式,从性能角度来看,consteq_ref是最好的,其次是refrangeALL是最差的访问类型,因为它需要扫描整个表。通过分析EXPLAIN输出中的type值,可以评估查询的性能,并据此优化查询或调整索引策略。