该 sql 语句在生产环境执行需要 50s,如何改进它,有没有更好的解决方案 ?
SELECT `a`.* FROM `cs_goods` AS `a` WHERE
( SELECT COUNT(`b`.`id`) FROM `cs_goods` AS b
WHERE `b`.`cs_merchant_id` = `a`.`cs_merchant_id`
AND `b`.`created_at` > `a`.`created_at`
AND `status` = 1 and `audit_status` = 2 and `sq_type` <> 3
) < 3 AND `status` = 1 and `audit_status` = 2 and `sq_type` <> 3
ORDER BY `a`.`created_at` DESC LIMIT 100;
cs_goods 表结构:
需求:拿到 cs_goods 表中最新的 100 个商品(按 created_at 倒序),且每个超市的商品不能超过 3
个(cs_merchant_id 是超市) 也就是一共需要拿到 100 个商品,但是每个超市不能超过 3 个。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在无法改变原有需求的前提下,又要考虑性能问题,
可以考虑降低数据基数,取最新的 1000 条数据来进行处理,
这样就比操作整张表的效率要高很多很多,压力也比较小
以下是正确的 sql,执行时间 0.111s
执行结果图:
可以用 left join 来链接自身:
另外,最好再给 cs_merchant_id 建一个索引。
试试呗,希望可以帮助到你。
要满足这种需求,还是再新建一个表比较好,表里边就存每个超市最新3个商品的id和上架时间。
需要的时候直接按 created_at 倒序取出100条数据即可