簡體   English   中英

MySQL:如何優化此 JOIN 查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM