数百万数据 门店销售订单 按门店 分组排序分页 取销售额前 20 条 怎么优化 order by

2020-12-24 17:06:11 +08:00
 wuzhizuiguo
大致 有订单表 order, 含 amount storeid (每单销售额, 销售门店)
select storeid,sum(amount) as total
from
order
group by storeid
order by total desc
limit 0,20
数据量快千万了, 不加 order by 排序 很快. 但是分页需要显示销售额最高的前 20 条数据, 不可避免排序
一般数据量大的改怎么分组 排序? (数据量很大, 取出来 放代码里排 统计 也不行)

实际上也需要连接其他表? 是先主表分组后再 left join 还是 left join 后 再分组?
请问下大佬们是怎么解决的.
2594 次点击
所在节点    MySQL
27 条回复
IDAEngine
2020-12-25 06:15:09 +08:00
尽量不要弄实时,10 分钟刷一次还是可以接受的,毕竟数据量不小了,而且还会增加
Nillouise
2020-12-25 08:56:49 +08:00
门店数量应该不多吧,应该只有几百几千个?为什么找前 20 个会很慢?

用 dynamodb 按 storeId 做分区键感觉可以解决?
Nillouise
2020-12-25 09:20:13 +08:00
我发现可以定时统计出前 100 销售额的门店,后面实时查询的时候就只查这 100 个门店即可。
wuzhizuiguo
2020-12-25 10:55:24 +08:00
@wangritian 没有加锁, 订单插入了,异常 统计销售的没有插入..
SlipStupig
2020-12-25 11:20:59 +08:00
1.首先先检查索引,正确索引效率能提高百倍。
2. 使用正确数据结构,能也能有所帮助
3. 如果经济状态有富裕的情况下去,尽量提高机器配置,这个可能比绞尽脑汁提高语句来的快
4.改造订单号,好的订单号设计,能减轻检索压力
5. 表按时间分区,比如:ordered_2020_12_25,时间跨度长的话,可以直接通过对分区表的操作,实现 mapreduce,这个就是另外, 时区跨度过大,采用 filter sort,而不是直接排
wuzhizuiguo
2020-12-25 11:28:54 +08:00
@Nillouise 因为要按额度排序, 选择时间范围内, 数据量多
wuzhizuiguo
2020-12-25 16:23:21 +08:00
谢谢. 汇总下. 分区尝试了,失败了.
缓存, 如果是看整体的, 不涉及时间的可以. 跑定时器,查出所有的门店情况, 缓存着.
老数据每天存起来, 查的时候, 时间按天来, 以前的去找老数据,今天的去库里 建时间索引查询.
还有就是数据库的性能也很关键,同一条语句, 正式测试环境差距很大, 耗时是 0.几秒 -> 三四秒, 再加条数统计就更爆炸了.
准备暂时不改动... 慢就慢吧.
要改的时候, 就采用 订单产生后 相应的去统计表里 按天增量数据, 查询的时候 老数据结合新数据.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/738660

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX