在 MySQL 的执行计划中,eq_ref
是一种连接类型(type
),表示查询优化器在使用**主键(PRIMARY KEY)或唯一索引(UNIQUE INDEX)**进行等值匹配(=
)时,对表的访问方式。它通常出现在多表关联查询(如 JOIN
)中,且被驱动表的连接条件使用了主键或唯一索引。
关键特点
-
等值匹配
连接条件必须使用=
操作符,例如:ON table1.id = table2.id
。 -
唯一性约束
被驱动表的连接字段必须是主键或唯一索引,确保每个驱动表的记录在被驱动表中最多匹配一行。 -
高效性
由于唯一性约束,eq_ref
是性能最优的连接类型之一,仅次於const
(单表常量查询)。
示例场景
假设有两个表:
users
表:主键为id
。orders
表:外键user_id
引用users.id
,且user_id
是唯一索引。
执行以下关联查询:
EXPLAIN SELECT *
FROM users
JOIN orders ON users.id = orders.user_id;
执行计划中 orders
表的访问类型会是 eq_ref
,因为:
users.id
是主键。orders.user_id
是唯一索引,确保每个users
记录在orders
表中最多匹配一行。
与 ref
的区别
ref
:使用非唯一索引进行等值匹配,可能返回多行。例如普通索引。eq_ref
:使用主键或唯一索引进行等值匹配,最多返回一行,性能更高。
如何优化到 eq_ref
?
- 确保连接字段有唯一索引
为被驱动表的连接字段添加主键或唯一索引。 - 检查查询条件
确保连接条件使用=
且字段类型一致。
总结
eq_ref
表示通过主键或唯一索引实现高效的等值关联查询,是优化良好的执行计划标志。若查询中出现 eq_ref
,通常说明索引设计合理,关联查询性能较高。