SQL内部联接性能问题

时间:2017-06-15 15:59:42

标签: mysql sql database performance

我得到了这个SQL查询

SELECT clicks, 
       songs.uid, 
       songs.title, 
       songs.artist      AS artistUID, 
       artists.name      AS artist, 
       songs.tag         AS tagUID, 
       tags.name         AS tag, 
       songinalbum.album AS albumUID, 
       albums.title      AS album, 
       albums.cover 
FROM   songs 
       INNER JOIN stats 
               ON stats.uid = songs.uid 
       INNER JOIN artists 
               ON artists.uid = songs.artist 
       INNER JOIN tags 
               ON tags.uid = songs.tag 
       INNER JOIN songinalbum 
               ON songinalbum.song = songs.uid 
       INNER JOIN albums 
               ON albums.uid = songinalbum.album 
WHERE  stats.type = 'songs' 
       AND albums.completed = 1 
ORDER  BY clicks DESC 
LIMIT  20 offset 0 

此查询的执行时间约为 13.5秒,但当我删除INNER JOIN tags ON tags.uid = songs.tag并在select语句songs.tag AS tagUID, tags.name AS tag中时,执行时间减少到 0.31秒即可。怎么可能?

这是标签表的结构:

修改: 这是歌曲表的样子,那些uid指的是专辑/艺术家/标签表中的相应条目等。用于防止机器人抓取我的网站,因为内容可用在https://www.url.de/song/{{uid}}下,如果我使用id,机器人可以将id增加一个来爬行孔站点。   

1 个答案:

答案 0 :(得分:0)

  • id在许多表格中似乎未被使用且不必要;摆脱它。
  • 更改为PRIMARY KEY(uid),因为它似乎正在为此目的服务。
  • 请确保uidCHARACTER SET ascii COLLATION ascii_bin
  • 多少内存? innodb_buffer_pool_size的价值是多少?整个数据集有多大?如果这些不是好的大小,那么随着数据集的增长, 会出现性能问题。 (UUID效率低下。)
  • 在执行所有ORDER BY之前,可以将LIMITJOINs移动到子查询中以获得20行;这会加快速度。但在知道哪个表格clicks之前,我不能更具体。