我得到了这个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增加一个来爬行孔站点。
答案 0 :(得分:0)
id
在许多表格中似乎未被使用且不必要;摆脱它。PRIMARY KEY(uid)
,因为它似乎正在为此目的服务。uid
为CHARACTER SET ascii COLLATION ascii_bin
。innodb_buffer_pool_size
的价值是多少?整个数据集有多大?如果这些不是好的大小,那么随着数据集的增长, 会出现性能问题。 (UUID效率低下。)ORDER BY
之前,可以将LIMIT
和JOINs
移动到子查询中以获得20行;这会加快速度。但在知道哪个表格clicks
之前,我不能更具体。