如何优化这条MySQL慢查询语句以提升执行速度?
优化这个MySQL慢查询的实用步骤
首先,从慢日志的信息来看:查询耗时88秒,扫描了114197行却只返回50行,核心问题大概率是索引缺失或执行计划不合理,下面是一步步的优化建议:
优先给过滤条件加精准索引
你的查询里有个明确的常量过滤:r.receiver_email_id = 3223,这是最应该先优化的点。给email_routing表创建针对这个字段的联合索引(把查询中用到的该表字段也加进去,避免回表):CREATE INDEX idx_email_routing_receiver ON email_routing(receiver_email_id, status, basket);这样MySQL可以直接从索引里拿到
r.status、r.basket和关联所需的字段,不用再去扫描全表。检查关联表的索引
从查询语句看,你关联了people_emails p和email_routing r,还有n1、s1这些关联表。确保所有关联字段都有索引:- 如果是
p.id = r.sender_email_id这类关联,people_emails.id作为主键应该已经是索引,但如果r.sender_email_id没有索引,也要补上; - 对于
n1.full_name这类字段,如果是通过p.sender_id = n1.id关联,n1.id作为主键没问题,但如果有其他过滤条件,也要对应加索引。
- 如果是
用EXPLAIN分析执行计划
跑一下EXPLAIN命令看MySQL到底怎么执行这个查询:EXPLAIN SELECT n1.full_name AS sender_full_name, s1.email AS sender_email, e.subject, e.body, e.attach, e.date, e.id, r.status, n2.full_name AS receiver_full_name, s2.email AS receiver_email, r.basket FROM people_emails p JOIN email_routing r ON r.receiver_email_id = 3223 AND r....;重点看
type列:如果是ALL说明全表扫描,key列显示用了哪个索引。如果email_routing表的type是ALL,那就是索引没生效,要检查索引是否正确创建、字段类型是否匹配(比如有没有隐式转换)。更新表统计信息
有时候MySQL的统计信息过时,会导致优化器选错执行计划。可以更新相关表的统计信息:ANALYZE TABLE email_routing; ANALYZE TABLE people_emails;考虑减少不必要的字段
如果e.attach是大字段(比如存储附件二进制数据),如果业务上不需要返回这个字段,就删掉它;如果必须要,也可以考虑是否能通过延迟加载来减少单次查询的开销。
内容的提问来源于stack exchange,提问作者user164863
相关产品推荐
相关产品推荐

