news 2026/8/20 11:10:52

SQL优化案例:巧用主键分页减少DISTINCT开销

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL优化案例:巧用主键分页减少DISTINCT开销

SQL优化案例:巧用主键分页减少DISTINCT开销

SELECT task.task_name AS taskName, GROUP_CONCAT( DISTINCT template.template_name SEPARATOR ';' ) AS templateName, a.batch_number AS batchNumber, COUNT( DISTINCT a.task_detail_id ) AS detailNum, MIN( a.STATUS ) AS STATUS, SUM( CASE WHEN a.STATUS = '2' THEN 1 ELSE 0 END ) AS docNum, SUM( CASE WHEN a.STATUS = '2' THEN 1 ELSE 0 END ) AS successNum, SUM( CASE WHEN a.STATUS = '1' THEN 1 ELSE 0 END ) AS failNum, a.generation_method AS generationMethod, MIN( a.create_time ) AS createTime, a.last_update_time AS lastUpdateTime FROM table_batch a INNER JOIN table_template template ON a.acc_template_id = template.acceptance_template_id INNER JOIN table_task task ON task.task_id = template.task_id WHERE task.task_id = '123456' GROUP BY a.batch_number ORDER BY createTime DESC LIMIT 20 # limit是分页器添加的

背景

线上一张分表数据量达900w+,某查询在小数据量时<1s,数据量上来后飙到1min+。

适用场景

  • 页面数据量有上限(可预期,比如500,1000)
  • GROUP BY 分组后总量远大于单页数据量
  • 无法改造索引或表结构

核心优化点

优化前优化后
全表GROUP BY + DISTINCT → LIMIT先分页取主键batch_number → 再IN查询
900w+数据参与去重仅500条数据参与去重

效果

查询时间从 60s+ 降至 20s 左右,优化约66%

问题分析

SIMPLEtaskPRIMARY,index_task_idPRIMARY202const1Using temporary; Using filesort
SIMPLEtemplatePRIMARY,idx_template_id,idx_task_id,idx_acceptance_template_ididx_task_id403const2
SIMPLEaidx_batch_task,idx_acc_template_ididx_acc_template_id203acceptancedoc.template.acceptance_template_id1118Using index condition

explain 显示索引全命中,但 COUNT(DISTINCT) 和 GROUP_CONCAT(DISTINCT) 导致索引扫描后还需额外去重,成为性能瓶颈。
在小数据量时,查询1s内,数据量达到900w+时,查询时间来到1min+

排查后,发现,count(distinct)以及group_concat(distinct)严重拖慢了查询效率
或者说主要是distinct,原先只需扫描索引,现在多了一步去重。

优化思路

受业务限制,分页最大500条,但分组后总量8000+。参考游标分页思想——缩小WHERE范围。
由于无法使用 > 游标,改用两步法:

  • 查询所需页的主键id
SELECT a.batch_number AS batchNumber FROM table_batch a INNER JOIN table_template template ON a.acc_template_id = template.acceptance_template_id INNER JOIN table_task task ON task.task_id = template.task_id WHERE task.task_id = '123456' GROUP BY a.batch_number ORDER BY MIN( a.create_time ) DESC limit 20
  • 按主键id查询所需页的所有数据
SELECT task.task_name AS taskName, GROUP_CONCAT( DISTINCT template.template_name SEPARATOR ';' ) AS templateName, a.batch_number AS batchNumber, COUNT( DISTINCT a.task_detail_id ) AS detailNum, MIN( a.STATUS ) AS STATUS, SUM( CASE WHEN a.STATUS = '2' THEN 1 ELSE 0 END ) AS docNum, SUM( CASE WHEN a.STATUS = '2' THEN 1 ELSE 0 END ) AS successNum, SUM( CASE WHEN a.STATUS = '1' THEN 1 ELSE 0 END ) AS failNum, a.generation_method AS generationMethod, MIN( a.create_time ) AS createTime, a.last_update_time AS lastUpdateTime FROM table_batch a INNER JOIN table_template template ON a.acc_template_id = template.acceptance_template_id INNER JOIN table_task task ON task.task_id = template.task_id WHERE task.task_id = '123456' and batch_number in #{pageBatchNumber} GROUP BY a.batch_number ORDER BY createTime DESC

拆成两个sql,减少了去重的数据量,由原先对所有去重再分页,变成了先分页再去重
尽管先分页获取主键id,受限于大数据量下group by的速率,但相较之前,查询速度还是优化了7成左右

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 11:09:34

制造业数据防篡改:从神钢事件看供应链诚信体系建设

1. 从“神钢”事件看制造业数据诚信的崩塌 最近&#xff0c;一则关于日本神户制钢所&#xff08;KOBELCO&#xff09;的旧闻又被翻了出来&#xff0c;说的是其社长因数据造假丑闻而引咎辞职。这可不是什么新鲜事&#xff0c;但每次看到类似的案例&#xff0c;作为一个在制造业和…

作者头像 李华
网站建设 2026/8/20 11:07:09

库存管理P系统订货上限计算:从原理到Excel/Python实践

库存控制是供应链管理、生产计划和零售运营中的核心环节&#xff0c;其目标是在满足客户需求的同时&#xff0c;最小化持有成本和缺货风险。在众多库存控制策略中&#xff0c;定期检查系统&#xff08;Periodic Review System&#xff09;&#xff0c;尤其是其中的P系统&#x…

作者头像 李华
网站建设 2026/8/20 11:04:23

摄像头流媒体太乱?go2rtc 用一个文件解决多协议统一出流

摄像头流媒体太乱&#xff1f;go2rtc 用一个文件解决多协议统一出流 【免费下载链接】go2rtc Ultimate camera streaming application 项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc 晚上十一点半&#xff0c;我蹲在客厅地板上&#xff0c;面前是三台各说各…

作者头像 李华
网站建设 2026/8/20 11:01:41

paper.json:构建机器可读学术论文,赋能LLM智能体高效科研

1. 项目概述&#xff1a;当论文遇见智能体&#xff0c;一场格式革命正在发生 作为一名长期在AI应用开发一线摸爬滚打的从业者&#xff0c;我最近被一个看似简单却极具潜力的概念吸引了&#xff1a; paper.json 。这不仅仅是一个文件格式&#xff0c;它更像是一个“公约”&…

作者头像 李华
网站建设 2026/8/20 11:01:35

从零搭建本地AI服务器:低成本部署大模型与Stable Diffusion实战指南

这次我们来看一个现象级的市场热点&#xff1a;AI服务器。你可能已经看到过“一天赚1.3亿”这样的标题&#xff0c;这背后反映的是全球范围内对AI算力近乎疯狂的渴求。这篇文章不聊宏观趋势&#xff0c;我们聚焦于一个更实际的问题&#xff1a;作为开发者、技术团队或中小企业&…

作者头像 李华