缓慢的 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内部连接查询运行缓慢

在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?

Mysql InnoDB 视图变得缓慢并且不使用 Where 子句

在 MySql 中的 WHERE 语句上使用 OR 会导致执行缓慢

避免重复的mysql连接

如何解决SQL Server查询速度缓慢的问题