2016-03-23 141 views
3

下面的查詢慢得令人難以置信,最有可能下降到子查詢刪除子查詢以提高性能

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  

回答

2

你的子查詢加入到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行與上面你只可以通過調整組或使用不同等來刪除重複項。