You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化这条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:41