Mysql 如何提升 Group by + Having 型子查询的查询速度(千万级别数据)

2015-03-18 16:59:41 +08:00
 abcfyk
如题所示。
有一出货记录表 outDetail。表中大约3000W条数据。
字段如 outId, skuId, outDate, outQty等。

现想查出最近三个月没有出货的SKU号。有如下SQL:
select skuId from outDetail group by skuId having max(outDate) < date_sub(curdate(), interval 90 day);

查询速度很慢。请问如何优化?
10983 次点击
所在节点    MySQL
25 条回复
abcfyk
2015-03-19 12:23:07 +08:00
@sohoer 可能是思路问题。放mysql做也许不是个好办法。
abcfyk
2015-03-19 12:36:56 +08:00
@frankzeng 不是实时数据,所以目前做了一些小修改。

@npc0der 后来又做了一些小修改。

首先修改了取SKU的接口,只取SKUID,不取其他信息。能节省大量时间,再缓存到一些文件中。暂时没有放在redis,速度提升已经非常大了。只是还剩下一个内存占用的问题。

就是PHP 无法手动释放内存,你 unset 了某个变量并不会马上释放这个变量占用的内存空间,、还是要等 GC 来自动回收。默认的128M内存真的是捉襟见肘。。。
jhdxr
2015-03-19 22:45:10 +08:00
@Septembers 我现在有个单表2亿的,在合适的索引的配合下,目前我的查询均可以在0.3s内完成。然后上个月把数据同样地拷了一份到postgresql里去,配合同样的索引,效率远不如mysql。用explain看了下也已经走了索引了。不知道能否指教下有哪些需要注意的点?
li24361
2015-03-24 22:49:07 +08:00
@frankzeng 这样的话,数据实时更新了,统计表的信息就不准确了,必须每次存量跑
li24361
2015-03-24 22:59:49 +08:00
@yangqi 我觉得也是额

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

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

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

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

© 2021 V2EX