2015-08-30 138 views
3

我有兩個表AB都非常大。我試圖做這樣的查詢,但它需要幾分鐘才能完成。表A的索引爲name,表B的索引爲other_nameMySQL查詢運行速度慢,在多個條件在哪裏

SELECT * FROM A 
LEFT JOIN B ON A.id = B.id 
WHERE A.name = 'text' OR B.other_name = 'text' 

如果我使用UNION執行單個條件,則查詢運行速度非常快,如預期的那樣。

SELECT * FROM A 
LEFT JOIN B ON A.id = B.id 
WHERE A.name = 'text' 

UNION 

SELECT * FROM A 
LEFT JOIN B ON A.id = B.id 
WHERE B.other_name = 'text' 

我不明白爲什麼第一次運行比第二次慢得多。

回答

3

在你的第二個查詢,第二個連接變爲內部連接,因爲where條款:

SELECT * 
FROM A LEFT JOIN 
    B 
    ON A.id = B.id 
WHERE A.name = 'text' 
UNION 
SELECT * 
FROM A JOIN 
    B 
    ON A.id = B.id 
WHERE B.other_name = 'text'; 

這種查詢可以使用索引對A(name)B(other_name),在每兩個部分。

第一個查詢只能使用一個索引。但是,它既沒有索引完全滿足查詢,所以它最終處理沒有索引的查詢。

4

只需添加到戈登·利諾夫的答案,直接從dev.mysql

最小化或關鍵字的WHERE子句。如果沒有幫助定位OR兩側值的索引,則任何行都可能成爲結果集的一部分,因此所有行都必須經過測試,並且需要全表掃描。如果您有一個索引有助於優化OR查詢的一側,另一個索引可幫助優化另一側,請使用UNION運算符運行單獨的快速查詢,然後合併結果。

相關問題