MySQL 查询问题求教

2019-01-18 18:11:21 +08:00
 lyusantu
查询一个商家列表,同时每个商家又返回自己店铺销量最高的三条数据

商家 1 -> 货品 1,货品 2,货品 3
商家 2 -> 货品 1,货品 2,货品 3
商家 3 -> 货品 1,货品 2,货品 3

大佬们在 MySQL 下有什么好的解决方案吗,现在写的 SQL 在数据量大的情况下执行>60s,所以这个要废弃的 SQL 就不拿出来献丑了
2775 次点击
所在节点    程序员
29 条回复
realpg
2019-01-18 20:29:20 +08:00
进数据库全是简单查询才是优化的终极目标

你这完全反过来……
rockyou12
2019-01-18 20:51:25 +08:00
搞个定时任务,分批次扫所有店铺把结构缓存下。你真业务量很大有要实时本来就不太可能,要准实时肯定只有把统计数据扔到其他专门的 OLAP 平台。不过还有个可能是 lz 忘了加索引或者数据没分页……
rockyou12
2019-01-18 20:53:52 +08:00
还有类似 kafka stream 这样的流计算也是很好的解决方案
nanmu42
2019-01-19 00:00:56 +08:00
没有写过 MySQL 的窗口函数,PG 里大概是这样,字段我就用中文了:

with 销量表 as (
select 商家 id, 货物 id, count(*) as 货物销量
from 销售流水
group by 商家 id, 货物 id
)
select 商家 id, 货物 id, 货物销量, row_number() over (partition by 商家 id order by 货物销量) as 货物排名
from 销量表
having 货物排名 < 4;

由于不清楚你具体的数据结构,只能算抛砖引玉了。
bigzhu
2019-01-19 00:08:36 +08:00
@nanmu42 他肯定看不懂
ChaselPansy
2019-01-19 00:09:19 +08:00
开三个销量最高字段,定时离线计算,比如每晚算好。
msg7086
2019-01-19 03:21:02 +08:00
可以 defer 的话 defer 到 cron 里执行。
要当场跑的话 N+1。
强行做复杂查询可以找 Oracle 看看有没有解决方案。
gz911122
2019-01-19 19:59:12 +08:00
mysql 8.0 使用窗口函数
Tomorrowxxy
2019-01-21 10:24:05 +08:00
@wysnylc #17 楼说说他的 sql 查询时间长我让他看别人类似的 sql 写法 这完全没毛病,你怎么就知道楼主写的 sql 没问题呢,先知? 至于你的素质也是呵呵就可以形容的了

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

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

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

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

© 2021 V2EX