2013-04-04 92 views
2

這個非常簡單的查詢花費了大量的時間:我可以優化此查詢嗎?

SELECT text, url, docid 
FROM retrieve 
LEFT JOIN citations2 
ON citations2.fromdoc = retrieve.docid 
WHERE citations2.todoc IS NULL 
LIMIT 10; 

它有一個左連接用NULL條件......會是事業?我到處都有索引。

這裏是慢查詢日誌:

# Time: 130404 8:00:31 
# [email protected]: em[em] @ zebra [130.239.162.142] 
# Query_time: 27.006579 Lock_time: 0.000019 Rows_sent: 0 Rows_examined: 90682 
use em_bg04; 
SET timestamp=1365055231; 
SELECT text, url, docid FROM retrieve LEFT JOIN citations2 ON citations2.fromdoc = retrieve.docid WHERE citations2.todoc IS NULL LIMIT 10; 

這裏是涉及的表的示意圖,與尺寸一起(保持向下滾動以查看的EXPLAIN輸出爲查詢)

Table citations2

Table retrieve

這裏的EXPLAIN輸出:

enter image description here

如此看來,它要經過整個表...當然。我讀this,但我無法理解它。那麼,有沒有辦法讓這個查詢更快?

+0

嘗試增加在'ON'子句where子句'選擇文本,URL,docID的 FROM檢索 LEFT JOIN citations2 ON citations2.todoc IS NULL AND citations2.fromdoc = retrieve.docid LIMIT 10;' – Meherzad 2013-04-04 09:26:03

+0

@Meherzad現在好多了!謝謝(如果您將您的評論複製到答案我會接受) – dsign 2013-04-04 09:29:31

回答

2

嘗試此查詢

你正在服用短路的優勢,因此,如果第一個條件爲假,它不會去檢查第二個條件..

希望它可以幫助...

SELECT 
    text, 
    url, 
    docid 
FROM 
    retrieve 
LEFT JOIN 
    citations2 
ON 
    citations2.todoc IS NULL AND 
    citations2.fromdoc = retrieve.docid 
LIMIT 10; 
+0

當然有幫助!謝謝! – dsign 2013-04-04 09:40:19

+0

+1對我來說很好 – 2013-04-04 09:40:22

+0

很高興能幫到.... :) – Meherzad 2013-04-04 09:45:08

1

Meherzads查詢看起來很有希望。但我會用他的查詢結合新創建的索引

IDX_FROMDOC_TODOC它包含兩列。

+0

感謝您的建議。你認爲優化器能夠在查詢中使用@Meherzad寫的組合索引嗎?我知道我應該嘗試自己看看,但這意味着現在要停止一些事情:-( – dsign 2013-04-04 09:45:24

+0

我會嘗試使用索引'todoc_fromdoc',以匹配列在測試中被檢查的順序。但是,有多少列有NULL'todoc',這可能根本無濟於事。 – 2013-04-04 13:05:33