“喜欢”与“加入”查询的MySQL含义

时间:2010-08-15 00:10:37

标签: mysql performance scale

我有两张桌子 - 视频和播放列表

通常我会为1-Many关系创建两个相应的表和一个多值表,这样:

视频= [pk,videoId,标题等..]
播放列表= [pk,title等。]
Playlists_Videos = [VideosFK,PlaylistFK]

或者,我一直在考虑仅创建两个表并在播放列表表中有一个字段,该字段具有逗号分隔的VideoFK字符串。我的应用程序可以在id字符串上“拆分”,然后根据id的数组从缓存中检索元素,所以:

视频= [pk,videoId,标题等..]
播放列表= [pk,videoIds,title等。]

示例数据可能如下所示:
视频 - 1,“abcd”,标题,...
视频 - 2,“efgh”,另一个标题,...
视频 - 3,“ijkl”,另一个,... 视频 - 4,“mnop”和另一个,... ...

播放列表 - 1,“abcd,efgh,ijkl,mnop”,...

使用这种结构,如果我想查找包含视频的所有播放列表,我可以使用如下设置查询:

SELECT * 
 FROM Playlists 
WHERE videoIds like '%VideoID%';

否则我可以在传统模型中执行标准连接查询:

SELECT * 
  FROM Playlists 
 WHERE pk in (SELECT PlaylistFK 
               FROM Playlists_Videos pv 
              WHERE VideoFK = '%videoPK%');

虽然这有效,但我想了解自己正在做什么,并且好奇MySQL在较低级别上做了什么。有什么警告?缩放时这是如何执行的?

由于

编辑 - “videoIds”包含在varchar中,该varchar是逗号分隔的唯一字符串视频标识符字符串(YouTube视频ID)

1 个答案:

答案 0 :(得分:2)

暂时考虑一下:

WHERE videoIds like '%VideoID%';

如果videoid值为1,则匹配:

  • 10
  • 11
  • 21
  • 31
  • 等...

为了您自己(和我们的),请使用三个表格设置:

  • 视频= [pk,videoId,title等。]
  • 播放列表= [pk,title等。]
  • Playlists_Videos = [VideosFK,PlaylistFK]