缓慢的 MySQL 查询:有没有办法避免对左连接的每一行进行条件选择计数?
Posted
技术标签:
【中文标题】缓慢的 MySQL 查询:有没有办法避免对左连接的每一行进行条件选择计数?【英文标题】:Slow MySQL Query: Is there a way to avoid doing a conditional select count for each row with a left join? 【发布时间】:2014-03-26 06:23:01 【问题描述】:表格 视频:id 评分:id、video_id、user_id、评分
每个视频可以有多个评分。视频表有 10,000 多行。有些视频可能还没有任何相关的评分数据。
我想挑选特定用户(在本例中为 user_id 1)尚未评分的所有视频。
查询:
SELECT
videos.id,
(SELECT count(id) FROM ratings WHERE user_id = 1 AND ratings.video_id = videos.id)
AS rating_count
FROM videos
LEFT JOIN ratings ON ratings.video_id = videos.id
GROUP BY videos.id
HAVING rating_count = 0
ORDER BY ratings.rating DESC
LIMIT 20
每次查询至少需要 4 秒。我可能不应该在这里使用左连接吗?
【问题讨论】:
【参考方案1】:您可以删除您的子查询并重写您的查询,如下所示,您也可以在加入的 on 子句中使用用户 ID AND ratings.user_id = 1
条件,因此即使与该用户无关,所有视频仍将返回
SELECT
videos.id,
count(ratings.id) AS rating_count
FROM videos
LEFT JOIN ratings
ON (ratings.video_id = videos.id AND ratings.user_id = 1)
GROUP BY videos.id
HAVING rating_count = 0
ORDER BY ratings.rating DESC
LIMIT 20
【讨论】:
谢谢。这有点帮助。但是,它每次仍以 2.5 秒左右的速度计时。 @TonyPaternite 使用上述查询,您需要create index my_idx on ratings (video_id, user_id);
的复合索引
哇!棒极了!非常感谢!!以上是关于缓慢的 MySQL 查询:有没有办法避免对左连接的每一行进行条件选择计数?的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?
Mysql InnoDB 视图变得缓慢并且不使用 Where 子句