1

I am using a query like this:

SELECT * FROM videos WHERE id IN (SELECT video_id FROM videos_tags WHERE tag_id = 2)

to search videos with the same tags, but with about 8'000 videos this query is too slow. How can I make this query faster? Maybe a JOIN is faster? Something like select * from videos_tags left join videos on (videos_tags.video_id = videos.id) where videos_tags.tag_id = 2 is faster?

4

2 回答 2

6

您可以替代使用JOIN而不是子查询。

SELECT  DISTINCT a.*
FROM    videos a
        INNER JOIN video_tags b
            ON a.ID = b.video_ID
WHERE   b.tag_id = 2

video_tags为了获得更快的性能,请在引用的表上创建外键约束videos。例如,(确保它video.ID是主键或唯一键

ALTER TABLE video_tags ADD CONSTRAINT vt_fk 
            FOREIGN KEY (video_ID) REFERENCES video(ID)

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-05-17T13:46:41.743 回答
2

您使用的是什么版本的 MySQL?优化的问题in似乎在 5.6 版本中得到修复。

我认为最快的版本是使用exists

SELECT *
FROM videos
WHERE exists (SELECT 1
              FROM videos_tags
              WHERE video_tags.tag_id = 2 and video_tags.video_id = videos.id
             )

此版本还有一个好处是您不会遇到多个匹配项(在标签表中)导致多个相同行的可能性。例如,如果您将查询更改为查找标签 2 和 3,而某些视频同时具有这两者,就会发生这种情况。

为了获得最佳性能,请在videos_tags(tag_id, video_id).

于 2013-05-17T13:48:56.473 回答