大型Mysql连接

大型Mysql连接,mysql,optimization,join,Mysql,Optimization,Join,假设我有两个大表,每个表中有超过1000万行 表1是一个电影表,用户ID表示用户观看了这部电影,表2是一个音乐表,用户ID表示用户观看了这首歌 我想做的是,只要用户想知道是否有一首歌与他看过的电影同名,就可以运行查询 比如说 SELECT movies.name FROM movies, music WHERE movies.name = music.name and movies.userID = '8a80828c2b46d717012b4801d2650002'; 我在两个表中都索引了电

假设我有两个大表,每个表中有超过1000万行

表1是一个电影表,用户ID表示用户观看了这部电影,表2是一个音乐表,用户ID表示用户观看了这首歌

我想做的是,只要用户想知道是否有一首歌与他看过的电影同名,就可以运行查询

比如说

SELECT movies.name FROM movies, music WHERE movies.name = music.name and movies.userID = '8a80828c2b46d717012b4801d2650002';
我在两个表中都索引了电影名和音乐名。问题是,当用户调用查询时,它似乎运行缓慢,这取决于表中有多少行以及用户观看/观看了多少电影/音乐

假设用户已观看了9000部电影,并录制了90k首歌曲。我将如何优化此查询以使其快速(最多不超过15秒)


编辑:对我来说,在每次观看电影后使用触发器去检查是否有歌曲存在,并用userID、movieID、musicID更新第三个表是否有意义?向数据库中插入的大量内容是否会导致触发器工作缓慢,进而影响数据库性能?

为什么不在电影用户ID上创建索引?因为它在WHERE子句中,所以应该运行得更快。

使用整数键,而不是字符串;还要在字符串比较检查之前移动userId(现在是整数)检查

select name from songs where name in (select name from movies where userid=5);

  • 在电影中保留用户ID索引
  • 在歌曲中保留名称索引

嘿,贝诺特,谢谢你的快速回答。在电影用户ID上添加索引有什么帮助?索引对于筛选表中的行很有用。在这里,您可以根据UserID列的内容筛选表电影。
select s.name from songs s
join (select name from movies where userid=5) as m
on s.name = m.name;