news 2026/8/22 17:02:22

排序与Top-N查询优化——排行榜场景下的执行计划、索引设计与性能实验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
排序与Top-N查询优化——排行榜场景下的执行计划、索引设计与性能实验

文章目录

    • 每日一句正能量
    • 1. 背景与问题
    • 2. 环境与数据
    • 3. 复现过程
      • 3.1 无索引情况下
      • 3.2 Top-N并不等于少量计算
    • 4. 方案实施
      • 4.1 建立排序方向匹配的索引
      • 4.2 联合条件下设计复合索引
      • 4.3 Top-N排序与内存
      • 4.4 参数调整
    • 5. 结果对比
      • 5.1 执行计划验证清单
        • 优化前
        • 优化后
    • 6. 风险与复盘
      • 风险一:索引过多
      • 风险二:排序字段频繁变化
      • 风险三:分页深度问题
      • 风险四:回退方案
  • 总结
    • 附录:实验SQL

每日一句正能量

“最深的期待不是填满,而是在心里精心留白。”
我们常以为期待是渴望某种到来,最深的那种,是为未知留下神圣的空隙。像国画的留白,不画满,反而让山水有了呼吸。心里有白,万物才能涌入。


1. 背景与问题

排行榜是互联网系统中最典型的Top-N业务,例如:

  • 商品销量Top100;
  • 用户积分排名;
  • 游戏战力榜;
  • 新闻热榜;
  • 风控规则排序。

业务通常写成:

SELECTuser_id,scoreFROMuser_scoreORDERBYscoreDESCLIMIT100;

很多开发人员认为只返回100行,所以SQL一定很快。

实际情况并非如此。

如果没有合适索引,数据库可能执行:

全表扫描 ↓ 读取百万行 ↓ 完整排序 ↓ 取前100

真正消耗时间的是:

排序的数据量

而不是:

最终返回的数据量

Top-N优化核心目标:

让数据库尽可能早知道哪些数据排在前面,而不是先把所有数据排序完成。


2. 环境与数据

测试环境:

KingbaseES 表: user_score 数据量: 5000万行 字段: user_id score create_time status

初始化:

CREATETABLEuser_score(user_idBIGINTPRIMARYKEY,scoreINTEGER,create_timeTIMESTAMP,statusINTEGER);

排行榜查询:

SELECTuser_id,scoreFROMuser_scoreWHEREstatus=1ORDERBYscoreDESCLIMIT100;

重点观察:

Sort节点 执行时间 Buffers 临时文件

3. 复现过程

3.1 无索引情况下

执行计划可能类似:

Limit | Sort | Seq Scan user_score

问题:

Seq Scan读取5000万行 Sort处理大量数据 Limit最后才生效

如果排序空间不足:

内存排序 ↓ 临时文件 ↓ 磁盘排序

性能进一步下降。

需要关注:

Sort Method Disk Usage Buffers read

3.2 Top-N并不等于少量计算

例如:

ORDERBYscoreDESCLIMIT10

数据库仍然需要回答:

谁是最高的10个人?

如果不知道score顺序,只能扫描更多数据。

因此:

返回10行 ≠ 只处理10行

4. 方案实施

4.1 建立排序方向匹配的索引

排行榜核心索引:

CREATEINDEXidx_score_rankONuser_score(scoreDESC);

再次执行:

EXPLAINANALYZESELECTuser_id,scoreFROMuser_scoreWHEREstatus=1ORDERBYscoreDESCLIMIT100;

理想计划:

Limit | Index Scan

变化:

原:

扫描5000万 排序5000万

后:

沿索引读取前100附近数据

4.2 联合条件下设计复合索引

实际排行榜通常有过滤条件:

WHEREstatus=1ORDERBYscoreDESCLIMIT100

如果只有:

score索引

数据库可能仍需要过滤大量无效行。

更合理:

CREATEINDEXidx_status_scoreONuser_score(status,scoreDESC);

原因:

索引顺序:

status分组 + score排序

可以减少扫描范围。


4.3 Top-N排序与内存

当无法完全利用索引时,数据库可能使用:

Top-N Heap

而不是完整排序。

完整排序:

5000万行全部排序

Top-N:

维护当前最大的100行

内存压力明显下降。

但注意:

如果N变大:

LIMIT1000000

Top-N优势会下降。


4.4 参数调整

排序相关参数需要结合业务:

关注:

work_mem maintenance_work_mem 临时文件大小

提高排序内存可能减少磁盘落盘。

但是:

并发环境下:

单SQL排序内存 × 并发连接数

可能造成内存压力。

因此不能简单调大。


5. 结果对比

测试示例:

方案执行计划P95Buffer Read
无索引Seq Scan + Sort18s大量
Top-N优化Top-N Heap6s降低
排序索引Index Scan + Limit120ms极低

示例结果说明:

真正有效的优化通常来自:

减少排序输入

而不是:


5.1 执行计划验证清单

每次优化后保存:

EXPLAINANALYZE

重点比较:

优化前
Sort actual rows=50000000
优化后
Index Scan actual rows≈100

观察:

Execution Time Buffers Sort Method

6. 风险与复盘

风险一:索引过多

排行榜索引提升读取:

但是增加:

INSERT成本 UPDATE成本 存储空间

需要评估写入压力。


风险二:排序字段频繁变化

例如:

实时积分榜

每秒大量更新score。

索引维护成本可能明显增加。

可考虑:

  • 缓存排行榜;
  • 定时汇总表;
  • 异步计算。

风险三:分页深度问题

很多系统:

LIMIT100OFFSET1000000

会导致大量跳过。

优化方式:

使用Keyset Pagination:

WHEREscore<:last_scoreORDERBYscoreDESCLIMIT100

避免深分页扫描。


风险四:回退方案

上线索引优化前:

  1. 保存原SQL;
  2. 保存原执行计划;
  3. 新索引灰度;
  4. 观察P95/P99;
  5. 异常删除索引或恢复SQL。

不要只看:

单次SQL耗时

还要看:

整体吞吐 CPU IO 锁等待

总结

Top-N查询优化的核心不是“让排序更快”,而是:

减少需要排序的数据

最佳实践:

执行计划分析 ↓ 确认Sort瓶颈 ↓ 设计匹配索引 ↓ 验证Index Scan ↓ 监控并发影响 ↓ 准备回退方案

排行榜场景中,一个正确设计的排序索引,往往可以让几十秒级查询降低到毫秒级。


附录:实验SQL

EXPLAINANALYZESELECTuser_id,scoreFROMuser_scoreWHEREstatus=1ORDERBYscoreDESCLIMIT100;CREATEINDEXidx_status_scoreONuser_score(status,scoreDESC);ANALYZEuser_score;

转载自:https://blog.csdn.net/u014727709/article/details/163863497
欢迎 👍点赞✍评论⭐收藏,欢迎指正

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

数学建模实战:从跳台跳水体型校正问题解析工程思维与模型构建

1. 项目概述&#xff1a;从一道赛题到一套方法论那年打开“华为杯”赛题包&#xff0c;看到A题《跳台跳水体型校正系数的建模分析》时&#xff0c;我第一反应是这题出得真“刁钻”。它巧妙地把一个大众熟悉的体育项目&#xff0c;包装成了一个典型的、开放性的工业级数学建模问…

作者头像 李华
网站建设 2026/8/22 16:57:10

Papermerge 部署教程:从环境自检到跑通第一篇文档 OCR 索引

Papermerge 部署教程&#xff1a;从环境自检到跑通第一篇文档 OCR 索引 【免费下载链接】papermerge Open Source Document Management System for Digital Archives (Scanned Documents) 项目地址: https://gitcode.com/gh_mirrors/pa/papermerge Papermerge 是一款专为…

作者头像 李华
网站建设 2026/8/22 16:55:27

当配图开始说谎:多模态情感分析的五种融合策略实战

当配图开始说谎&#xff1a;多模态情感分析的五种融合策略实战 【免费下载链接】Multimodal-Sentiment-Analysis 多模态情感分析——基于BERTResNet的多种融合方法 项目地址: https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis 纯文本情感分析有一个绕不…

作者头像 李华
网站建设 2026/8/22 16:53:39

临杭产业园融杭发展的最新观察

地处诸暨、萧山、富阳三地交汇处的次坞镇&#xff0c;是诸暨融杭发展的“桥头堡”&#xff0c;临杭产业园则是这一战略定位下产业落地发展的核心平台。今年以来&#xff0c;园区在项目招引、审批效率、配套建设等方面呈现出一系列新动向。一、项目落地提速&#xff0c;审批效率…

作者头像 李华