eq_ref 访问类型

在MySQL的EXPLAIN输出中,type
字段为eq_ref
表示查询使用了唯一索引的等值匹配,且每个索引值在关联表中对应唯一一条记录。这是性能较好的查询类型,仅次于system
和const
。
以下是关键特性与适用场景:
1. 核心特征
- 唯一性要求:必须基于主键或唯一索引(UNIQUE NOT NULL)进行关联查询,且索引所有部分都被使用。
- 单行匹配:每个索引值在关联表中只能匹配到一行数据,例如通过
=
操作符精确匹配主键或唯一键。 - 多表关联:通常出现在
JOIN
操作中,作为被驱动表(内表)的访问方式,且关联条件为主键或唯一键。
2. 典型场景示例
1-- 示例1:主键关联查询
2SELECT *
3FROM orders
4JOIN users ON orders.user_id = users.id -- users.id 是主键
5WHERE users.id = 100;
6
7-- 示例2:唯一索引关联查询
8SELECT *
9FROM product
10JOIN inventory ON product.sku = inventory.sku -- inventory.sku 是唯一索引
11WHERE product.category = 'electronics';
3. 与其他类型对比
类型 | 索引类型 | 匹配行数 | 典型场景 |
---|---|---|---|
const |
主键/唯一索引 | 单行 | 单表主键精确查询 |
eq_ref |
主键/唯一索引 | 单行 | 多表主键或唯一键关联 |
ref |
非唯一索引 | 多行 | 普通索引的等值查询 |
range |
索引 | 范围匹配多行 | BETWEEN 、IN 等范围查询 |
4. 优化意义
- 高效性:通过唯一索引直接定位单条记录,避免了全表扫描或索引范围查找。
- 关联查询优化:在多表连接中,若驱动表(外层表)的关联字段是主键或唯一键,被驱动表的
type
可能为eq_ref
,表明连接效率较高。 - 需满足条件:若未达到
eq_ref
(如出现ref
或ALL
),需检查关联字段是否为唯一索引,或数据是否存在重复值。
5. 注意事项
- LEFT JOIN限制:主表
LEFT JOIN
从表时,若未对从表添加过滤条件,可能导致全表扫描(ALL
),需通过WHERE
子句强制使用索引。 - 复合唯一索引:若使用联合唯一索引,需确保查询条件包含所有索引列,否则可能降级为
ref
。
通过分析eq_ref
类型,可以确认关联查询是否有效利用了唯一性约束,是优化复杂查询的重要指标。若需进一步优化,可结合key
(实际使用索引)、rows
(扫描行数)等字段综合分析。