MySQL执行计划中的eq_ref类型是面试必问的查询优化重点,它出现在表连接时,表示被驱动表通过主键或唯一索引进行等值匹配。理解eq_ref能帮助开发者快速定位慢查询问题,优化表连接性能。在实际应用中,当驱动表数据量远小于被驱动表时,eq_ref能发挥最大价值。本文通过真实案例解析eq_ref与ref的区别,并提供优化方案,帮助开发者掌握MySQL索引优化技巧,提升数据库查询性能。想获取更多MySQL优化技巧,可下载2025年Java面试宝典。
今天咱们来聊聊面试高频考点:mysql执行计划中的eq_ref类型。很多同学被问到"explain结果里的eq_ref代表什么"时,只能答出"关联查询用主键或唯一索引",但面试官真正想听的是你解决实际问题的思路。
2025年java面试宝典已整理上传,包含MySQL优化高频考点:点击获取(提取码:9b3g)
当面试官问你eq_ref时,其实是在考察:
比如某次我调优一个接口,发现LEFT JOIN查询突然变慢,查看explain发现驱动表用的是index_merge,而被驱动表是ALL全表扫描。这就是典型的关联字段没加索引导致性能雪崩。
eq_ref出现在表连接时,表示被驱动表通过主键或唯一索引进行等值匹配。注意这三个关键特征:
举个例子,用户表(user)和订单表(order)通过user_id关联。当order表的user_id字段建立了唯一索引,执行计划就会出现eq_ref。这时MySQL知道每查一个订单,最多匹配一个用户,性能自然高效。
上周帮同事优化过一个统计接口,原始SQL是这样的:
SELECT * FROM orders
LEFT JOIN users ON orders.user_id = users.id
explain结果显示users表的type是eq_ref,但orders表的type是ALL,这明显异常。原来orders表的user_id虽然加了索引,但统计的是历史订单,数据量突破百万级后全表扫描直接卡死。
优化方案分两步走:
优化后驱动表变成users,通过eq_ref快速定位关联订单,执行时间从3秒降到80ms。这里要注意的是,当驱动表数据量远小于被驱动表时,eq_ref才能发挥最大价值。
有次面试被问到:"eq_ref和ref有什么区别?什么时候该用哪个?"这里给大家划重点:
比如用户地址表,如果用city字段做普通索引查询,type就是ref,这时候如果select的字段不在索引中,就会产生回表查询。而通过用户ID查详情,走主键索引就是const(比eq_ref更快)。
需要购买面试鸭会员的同学注意啦!通过面试鸭返利网找我下单,可额外返现25元。我们用这个省下的钱,足够再买两本《高性能MySQL》实体书了不是?
最后给个忠告:不要盲目追求eq_ref!曾经见过为了所有联表都走eq_ref,给所有外键字段都加唯一索引,结果导致写操作性能严重下降。索引设计要权衡读写比例,比如日志类表更适合用覆盖索引配合ref类型。
建议大家多看看执行计划中rows列的值,这才是实际扫描行数的关键指标。有时候虽然走了eq_ref,但如果驱动表rows值过大,整体性能仍然不理想,这时候可能需要调整join顺序或使用straight_join强制索引。
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包