2014-04-09 100 views
0

我有以下查詢運行在MySQL 5.6中可愛,但在5.5它需要10秒執行,我知道有一個性能問題與舊的MySQL版本的NOT IN子句,但我沒有看到另一種方式來處理它在舊版本的MySQL,我真的很感激任何建議:Mysql查詢建議的Mysql 5.5

SELECT 
DISTINCT C.chapter, 
J.name 
FROM chart as C 
INNER JOIN resume as J ON J.serie_id = C.serie_id 
WHERE chapter NOT IN 
(
    SELECT DISTINCT chapter FROM chart WHERE recorded = '0000-00-00' 
) 
AND 
(
    C.chapter NOT IN 
    (
    SELECT chapter FROM chart_2 
) 
) 
ORDER BY chapter DESC 

Bassicly它的作用是從圖表表,然後從連接表的名稱選擇獨特的章節,然後再次選擇從圖表獨特的章節開始,其日期爲0000-00-00這意味着尚未記錄,並使用NOT IT進行匹配以排除第一個子查詢中的那些。我使用的是獨特的,因爲在圖表中,章節可以重複多次,我只想選擇那些記錄爲單個結果的章節(如分組)。最後,檢查chart_2表中不存在的章節。它可以在MySQL 5.6上正常工作,但在5.5中只需要很長時間。有任何想法嗎?

+1

您是否已經嘗試對此查詢進行說明? – davey

+0

是的使用解釋,看看它看起來如何。 –

+0

確定在我的路上,生病報告 – Aramil

回答

1

可能嘗試它作爲連接。

SELECT 
DISTINCT C.chapter, 
J.name 
FROM chart as C 
INNER JOIN resume as J ON J.serie_id = C.serie_id 
LEFT OUTER JOIN chart C1 ON C.chapter = C1.chapter AND C1.recorded = '0000-00-00' 
LEFT OUTER JOIN chart_2 C2 ON C.chapter = C2.chapter 
WHERE C1.chapter IS NULL 
AND C2.chapter IS NULL 
ORDER BY C.chapter DESC 
0

我個人已經有這麼多的表現較差的查詢像這樣的,我已經找到了更好的條款獲得值的列表單獨的查詢的,而不是使用子查詢。

因此,從SELECT DISTINCT章節中獲取一組結果FROM WHERE記錄='0000-00-00' 和選擇章節FROM chart_2,將它們合併,然後將它們添加到您的查詢中。