Daily Study
更新: 10/26/2025 字数: 0 字 时长: 0 分钟
Daily Plan
#todo
- [ ]
Mysql Explain Type
在 My SQL 的 EXPLAIN 语句中,type 字段是评估查询性能的一个关键指标。它描述了 MySQL 如何查找表中的行,也就是访问类型。type 的值越接近列表的顶部,查询性能通常越好。
1. system
描述: 这是最高效的访问类型。当表只有一行数据时(通常是
const的特例),MySQL 就会使用它。特点: 只有一行,所以可以直接访问,速度极快。
示例:
EXPLAIN SELECT * FROM a WHERE a.id = 1;如果表a只有一行,则可能显示为system。
2. const
描述: 表示通过索引直接查询到唯一的一行记录。这通常用于将主键(
PRIMARY KEY)或唯一索引(UNIQUE KEY)与一个常量进行比较。特点: 查询速度非常快,因为 MySQL 只需要读取一行数据。
示例:
EXPLAIN SELECT * FROM user WHERE id = 10;(其中id是主键)
3. eq_ref
描述: 常见于联表查询(
JOIN)。对于前一个表中的每一行,eq_ref都能通过主键或唯一索引找到后一个表中唯一匹配的一行。特点: 联表查询的最佳类型,效率高。
示例:
EXPLAIN SELECT * FROM user, order WHERE user.id = order.user_id;(其中order.user_id是外键,且有索引)
4. ref
描述: 也是一种联表查询中常见的类型,它表示通过非唯一索引(普通索引)来查找匹配的行。对于前一个表中的每一行,可能会找到后一个表中多行匹配的记录。
特点: 效率仍然很高,但比
eq_ref稍差,因为可能需要回表或扫描多行。示例:
EXPLAIN SELECT * FROM order, product WHERE order.product_id = product.id;(其中order.product_id是普通索引)
5. range
描述: 表示对索引列进行范围扫描。当查询条件使用
<,>,LIKE 'A%',BETWEEN,IN等操作符时,MySQL 会使用此类型。特点: 比全表扫描效率高,因为它只扫描索引的一个子集。
示例:
EXPLAIN SELECT * FROM user WHERE id BETWEEN 10 AND 20;
6. index
描述: 表示对整个索引树进行扫描,而不是对表数据进行扫描。
特点: 比
ALL快,因为它只读取索引文件,索引文件通常比数据文件小。但仍然是全索引扫描,效率较低。当查询的列都在索引中时,可能会使用此类型(覆盖索引)。示例:
EXPLAIN SELECT name FROM user;(如果name列有索引,且查询只涉及name,则会使用index)
7. ALL
描述: 最差的访问类型,表示全表扫描。MySQL 会遍历表中的每一行以找到匹配的记录。
特点: 效率最低,当表数据量大时,查询速度会非常慢。
示例:
EXPLAIN SELECT * FROM user WHERE age > 25;(如果age列没有索引)
system > const > eq_ref > ref > range > index > ALL
