Skip to content

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

菜就多练

本站访客数 人次 本站总访问量