本人是入门没多久的数据产品,今天写了一条查询最近15天没产生过订单的store。数据开发写的SQL比我写的出结果速度快了8倍。
有个地方实在没看懂,虚心请教。
SELECT s.id
FROM
`store`s JOIN
( SELECT `store_id` , MAX( `create_time`)t FROM `order` GROUP BY `store_id` )a
ON s.id = a.store_id
WHERE
s.channel = 2
AND s.show = 1
AND DATEDIFF( now(), a.t ) > 15
SELECT id
FROM
`store`s
where
s.channel = 2
AND s.show = 1
AND DATEDIFF(now(), (SELECT MAX( `create_time`) FROM `order` o where o.store_id = s.id)) > 15
看了下我SQL的运行性能分析,是因为order表数据太多行(大概有几千万吧),用了GROPU BY分组导致性能。
开发写的避开了使用GROPU BY ,但本人功力较浅,表示看不懂了:
在AND DATEDIFF(now(), (SELECT MAX( `create_time`) FROM `order` o where o.store_id = s.id)) > 15
的这个查询条件中,子查询语句里面输出MAX的时间,但是没有使用分组聚合的话,输出的不应该是只有一行数据吗?为什么能实现我按照store_id进行分组的需求?虽然大概猜到核心在于后面的o.store_id = s.id,但表示没看懂
我觉得是你的SQL逻辑问题,你的SQL把外层的where条件复制到聚合子查询里面会好些,不是所有优化器都主动做谓词下推,再者就是join的方式这个看数据库引擎