簡體   English   中英

刪除子查詢以提高性能

[英]Remove subquery to improve performance

以下查詢非常慢,很可能是子查詢

SELECT * 
FROM releases
INNER JOIN release_artists ON release_artists.release_id = releases.id
WHERE release_artists.artists IN (SELECT release_artists.artists
                                  FROM release_artists
                                  INNER JOIN charts_extended ON charts_extended.release_id = release_artists.release_id
                                  WHERE charts_extended.artist = 'Quickinho'
                                  GROUP BY release_artists.artists)
GROUP BY releases.id
ORDER BY releases.date DESC
LIMIT 0,60

charts_extended.artist有大約2500條記錄,所以這不應該花那么長時間。 我可以使用什么而不是子查詢?

EXPLAIN給出

1   PRIMARY releases    index   PRIMARY date    82  NULL    60  Using temporary
1   PRIMARY release_artists ref release_id  release_id  4   soundshe.releases.id    1   Using where; Using index
2   DEPENDENT SUBQUERY  charts_extended ref artist_2,release_id,artist  artist_2    82  const   2472    Using where; Using index; Using temporary; Using filesort
2   DEPENDENT SUBQUERY  release_artists ref release_id  release_id  4   soundshe.charts_extended.release_id 1   Using index

DESC如下

charts_extended

id  int(11) NO  PRI NULL    auto_increment
artist  varchar(80) NO  MUL NULL    
url text    NO      NULL    
release_id  int(11) NO  MUL NULL    
date    varchar(50) NO      NULL    
type    varchar(4)  NO      NULL    
source  varchar(3)  NO      NULL    

發布

id  int(11) NO  PRI NULL    
artist  varchar(255)    NO  MUL NULL    
all_artists varchar(200)    NO  MUL NULL    
format  varchar(80) NO  MUL NULL    
title   varchar(255)    NO  MUL NULL    
label   varchar(255)    NO  MUL NULL    
label_no_country    varchar(255)    NO  MUL NULL    
link    text    NO      NULL    
genre   varchar(50) NO  MUL NULL    
date    varchar(80) NO  MUL NULL    
image   text    NO      NULL    
favourite   varchar(1)  NO      NULL    
time    varchar(20) NO      NULL    
category    varchar(30) NO  MUL NULL    
format_category varchar(20) NO  MUL NULL    
display varchar(1)  NO      NULL    
image_stored    varchar(1)  NO      NULL

release_artists

id  int(11) NO  PRI NULL    auto_increment
release_id  int(10) NO  MUL NULL    
artists varchar(100)    NO      NULL    

您的子查詢加入到release_artists,但您的外部查詢也是如此,這是不尋常的。 看起來你想要發布藝術家的60個最新版本,圖表擴展arist是Quickinho。 如果我正確理解查詢,我認為你根本不需要子查詢。

我會嘗試

SELECT * FROM releases
INNER JOIN release_artists
ON release_artists.release_id=releases.id
INNER JOIN charts_extended
ON charts_extended.release_id=release_artists.release_id
WHERE charts_extended.artist='Quickinho'
GROUP BY releases.id
ORDER BY releases.date DESC
LIMIT 0,60

您沒有提供有關圖表擴展表的大量信息,但是如果您獲得重復項,因為每個發布藝術家有上述n行,您可以通過調整組或使用不同的等來刪除重復項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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