惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
D
Docker
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
V
V2EX
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
腾讯CDC
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
H
Help Net Security
博客园 - Franky
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏

博客园 - 幽州散人

synchronized 为啥会让虚拟线程卸载失效 主线任务和使命 温州3日之旅 CompletableFuture + 异步Servlet:同步的姿势、异步的效果 Snowflake雪花算法与发号器的应用 windows Java 幽灵转发壳进程 也谈MySQL limit offset深翻页问题 SHOW SESSION STATUS 与 Handler 变量 MySQL 5.7 Profiles 执行性能分析 MySQL临时表与文件排序 MySQL 5.7 MRR多范围读优化 MySQL 5.7 ICP索引条件下推优化 MySQL符合索引与最左前缀原则 从I/O 的物理成本理解回表和索引覆盖 第4个电瓶以及补漆 Flink原理:并行度与keyGroup桶 什么是数字批发银行 Java虚拟线程(三)实现原理 Java虚拟线程(二) Java虚拟线程(一) 大模型推理层服务化架构 传奇调查员之路:理智值-99,但我必须听懂深渊的语言 js里调用智能合约读/写函数的方法的区别 字节与其16进制字符表示转换的bug Redisson分布式锁 交易心得 DexScreener接口初探 某安全软件跑飞了。。 Ed25519算法签名与验签的Java实现 Tendermint拜占庭容错引擎
SQL优化案例
幽州散人 · 2026-09-10 · via 博客园 - 幽州散人

现有订单表orders,包含字段:order_id(主键)、user_id、product_id、amount、status、create_time。请写出以下查询的SQL:

(1)查询最近7天内,每个用户的总下单金额,按金额降序排列。
(2)针对该查询,建议建立什么索引并说明理由。

SELECT user_id, SUM(amount) AS total_amount
FROM orders
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY user_id
ORDER BY total_amount DESC;

为了不回表,建立联合索引(create_time, user_id, amount)
索引覆盖不单指查询返回列都在索引列里,也包括可以直接用二级索引返回的user_id, amount进行查询条件要求的排序和分组。

具体来说,存储引擎返回查二级索引的结果,列包括:主键,create_time, user_id, amount,结果返回到Server层,在Server层中完成排序、分组、count等工作,当然这个过程可能会用到临时表和文件排序,即Using temporary; Using filesort。

create_time有序,user_id接着也有序,>=可以借上索引的力。 但create_time 范围条件下,user_id 并不是全局有序,GROUP BY 通常借不上索引顺序的力,所以临时表基本跑不掉。
total_amount DESC 做了倒排、还要count统计,所以临时表是更跑不掉了,如果tmp_table_size不够,那么会用文件临时表,这个对性能有影响。
至于Using filesort,Server层在用临时表做了count之后,需要按count结果进行倒排,所以sort_buffer不够的情况下,Using filesort也跑不掉。