[英]MySQL: How do I Optimize this JOIN Query?
我有 3 張桌子; 藝術家、專輯、歌曲封面和歌曲。 我想 select 一張專輯以及該專輯中的歌曲總數。 我目前正在使用這個查詢,但它記錄在 mysql-slow.log 文件中。 PHPMyAdmin中,查詢速度不一致。 有時它會執行 0.0005 秒,有時會執行 2 秒或更長時間。
SELECT /*+ MAX_EXECUTION_TIME(1000) */ album.*,
artist_id, artist_aka, artist_slug, artist_profile_image, cover_filename,
(
SELECT COUNT(*)
FROM song
WHERE song.song_album_id = album.album_id
) AS TotalSongs
FROM album
LEFT JOIN artist ON album.album_artist = artist.artist_id
LEFT JOIN song_cover ON album.album_cover_id = song_cover.cover_id
ORDER BY album_id DESC LIMIT 0, 11
ROWS藝術家:15,978,專輯:14,167,歌曲:67,559,song_cover:12,668
先感謝您。
我會這樣寫:
EXPLAIN SELECT b.*,
a.artist_id, a.artist_aka, a.artist_slug, a.artist_profile_image,
c.cover_filename,
COUNT(*) AS TotalSongs
FROM album AS b
INNER JOIN artist AS a ON b.album_artist = a.artist_id
LEFT OUTER JOIN song AS s ON s.song_album_id = b.album_id
LEFT OUTER JOIN song_cover AS c ON b.album_cover_id = c.cover_id
GROUP BY b.album_id
ORDER BY b.album_id DESC LIMIT 0, 11;
這消除了依賴子查詢,有利於另一個連接和 GROUP BY。
這是我能猜到的 EXPLAIN 報告:
+----+-------------+-------+------------+--------+-------------------------------------+---------------+---------+-----------------------+------+----------+---------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+-------------------------------------+---------------+---------+-----------------------+------+----------+---------------------+
| 1 | SIMPLE | b | NULL | index | PRIMARY,album_cover_id,album_artist | PRIMARY | 4 | NULL | 1 | 100.00 | Backward index scan |
| 1 | SIMPLE | a | NULL | eq_ref | PRIMARY | PRIMARY | 4 | test.b.album_artist | 1 | 100.00 | NULL |
| 1 | SIMPLE | s | NULL | ref | song_album_id | song_album_id | 4 | test.b.album_id | 1 | 100.00 | Using index |
| 1 | SIMPLE | c | NULL | eq_ref | PRIMARY | PRIMARY | 4 | test.b.album_cover_id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+-------------------------------------+---------------+---------+-----------------------+------+----------+---------------------+
我的表中沒有數據,所以行數是微不足道的。
仍然存在一個問題,它正在對album
進行索引掃描,在您的情況下是 14,167 行。 那可能代價高昂。
但其他連接都使用索引。 其中兩個是type: eq_ref
,表示它正在加入這些表的主鍵。
我將連接artist
更改為內部連接。 我看不出一張專輯如何不能引用藝術家。 但我想一張專輯可能沒有歌曲,因此外部連接。
我覺得你將album
直接加入到song_cover
很奇怪。 song_cover
不是也需要引用它翻唱的原始song
嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.