eq_ref 访问类型

在MySQL的EXPLAIN输出中,type字段为eq_ref表示查询使用了唯一索引的等值匹配,且每个索引值在关联表中对应唯一一条记录。这是性能较好的查询类型,仅次于systemconst

以下是关键特性与适用场景:


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 索引 范围匹配多行 BETWEENIN等范围查询

4. 优化意义

  • 高效性:通过唯一索引直接定位单条记录,避免了全表扫描或索引范围查找。
  • 关联查询优化:在多表连接中,若驱动表(外层表)的关联字段是主键或唯一键,被驱动表的type可能为eq_ref,表明连接效率较高。
  • 需满足条件:若未达到eq_ref(如出现refALL),需检查关联字段是否为唯一索引,或数据是否存在重复值。

5. 注意事项

  • LEFT JOIN限制:主表LEFT JOIN从表时,若未对从表添加过滤条件,可能导致全表扫描(ALL),需通过WHERE子句强制使用索引。
  • 复合唯一索引:若使用联合唯一索引,需确保查询条件包含所有索引列,否则可能降级为ref

通过分析eq_ref类型,可以确认关联查询是否有效利用了唯一性约束,是优化复杂查询的重要指标。若需进一步优化,可结合key(实际使用索引)、rows(扫描行数)等字段综合分析。