如何编写更高效的MySQL查询以统计承包商对应表单提交数量
MySQL查询性能优化方案
1. 新增必要索引
当前查询耗时过长的核心原因是 form_submissions 表用于关联的 contractor_id 字段没有建立索引,每次关联都要全表扫描提交表的所有数据。
执行以下语句新增索引即可:
-- 普通索引即可满足需求,无需回表即可完成统计 CREATE INDEX idx_submissions_contractor_id ON form_submissions(contractor_id);
2. 调整SQL查询逻辑
原SQL的执行逻辑是先关联两张表再分组统计,会产生大量临时关联数据,改为先统计子表数据再关联主表的逻辑,大幅减少关联时的数据量:
SELECT a.id, a.contractor, IFNULL(b.submission_count, 0) AS submission_count FROM `contractorList` a LEFT JOIN ( SELECT contractor_id, COUNT(*) AS submission_count FROM form_submissions GROUP BY contractor_id ) b ON a.id = b.contractor_id ORDER BY a.contractor;
优化逻辑说明:
- 子查询仅对form_submissions表做一次分组统计,最多输出1200条结果(和承包商总数量一致)
- 主表仅需要和这1200条统计结果做关联,相比原写法关联后再统计动辄数万/数十万条数据的逻辑,性能提升非常明显
- 搭配上面新增的索引,子查询可以直接走索引完成统计,不需要访问表的实际数据,速度更快
效果预期
两个优化措施配合使用,原查询数分钟的耗时可以降低到毫秒级,完全满足需求。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

