没有获得WHERE IN的唯一结果但GROUP BY会变慢

时间:2014-08-01 12:26:12

标签: mysql sql database-performance

我试图获得具有多对多关系的独特结果表。我有带视频的表格,带有类别和数据透视表的表格。当我想只选择属于一个类别的视频时。我有大约50.000个视频和大约90个类别。当我尝试下一个查询时,我会收到视频的重复(每个类别一个),我只希望显示唯一的视频。

SELECT video_id, add_date  FROM videos 
INNER JOIN video_category ON videos.id = video_category.video_id
WHERE video_id IN (2, 1, 3, ... , 60) 
ORDER BY add_date DESC, video_id DESC

当我尝试通过video_id进行分组时:

SELECT video_id, add_date  FROM videos 
INNER JOIN video_category ON videos.id = video_category.video_id
WHERE video_id IN (2, 1, 3, ... , 60) 
GROUP BY video_id
ORDER BY add_date DESC, video_id DESC

此查询花了大约5-7秒,这太长了。

有什么建议我可以改写吗?

编辑: 添加了表别名

2 个答案:

答案 0 :(得分:1)

我假设这是您的查询:

SELECT s.video_id, s.add_date
FROM ac_scene s INNER JOIN
     ac_scene_category sc
     ON s.id = sc.ac_scene_id 
WHERE sc.ac_category_id IN (2, 1, 3, ... , 60) 
GROUP BY s.video_id
ORDER BY s.add_date DESC, s.video_id DESC;

如果是这样,请考虑重写查询并添加适当的索引:

select s.video_id, s.add_date
from ac_scene s
where exists (select 1
              from ac_scene_category sc
              where s.id = sc.ac_scene_id and
                    sc.ac_category_id IN (2, 1, 3, ... , 60)
             )
order by s.add_date DESC, s.video_id DESC;

为获得最佳效果,请在ac_scene_category(ac_scene_id, ac_category_id)ac_scene(s.add_date, s.video_id)上创建索引。

答案 1 :(得分:0)

嗯,你不能再真正简化你的查询了。如果5-7秒太长,那么性能问题将出现在您的数据库而不是您的查询中。

但请尝试使用DISTINCT

SELECT DISTINCT video_id, add_date  FROM ac_scene 
INNER JOIN ac_scene_category ON ac_scene.id = ac_scene_category.ac_scene_id 
WHERE ac_category_id IN (2, 1, 3, ... , 60) 
ORDER BY add_date, video_id DESC