2017-02-09 59 views
0

,我有以下形式的SQL表:檢查是否在MySQL表中的兩列相等太慢

| DateID | StartDate | EndDate | a lot more columns... 
|--------|-----------|----------|---------------------- 
| 1 |2017-02-09 |2017-02-16| ... 
| 2 |2017-02-10 | NULL | ... 
| 3 |2017-02-08 |2017-02-08| ... 

我經常遇到像Querys:

SELECT * FROM Dates 
WHERE (EndDate IS NULL AND StartDate<='some date') OR 
     (StartDate=EndDate AND StartDate>='some date' AND (other conditions)) 

因爲表包含幾個千條記錄,這個查詢相當慢。有沒有辦法加快這一點?例如,使用僅包含具有相同StartDate和EndDate的日期的視圖? StartDate和EndDate已被定義爲索引,但這對我猜測的「StartDate = EndDate」部分沒有幫助。

在此先感謝! :)

+0

嘗試創建2個querys避免'或' – SacrumDeus

+2

性能問題應該包括'EXPLAIN ANALYZE'和有關表的大小,指數,當前時間的一些信息表現,慾望時間等。「慢」是一個相對術語,我們需要真正的價值來比較。 \t \t [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

+0

MySQL index [ ** TIPS **](http://mysql.rjweb.org/doc.php/index_cookbook_mysql) –

回答

0

OR是你的問題。正因爲如此,MySQL不能依賴日期索引並採取另一個(壞)路徑,甚至是最壞的路徑,進行全表掃描。

克服這種問題的一般解決方案是通過UNIONing幾個查詢來模擬OR

SELECT * FROM Dates WHERE (EndDate IS NULL AND StartDate<='some date') 
UNION ALL 
SELECT * FROM Dates WHERE (StartDate=EndDate AND StartDate>='some date' AND (other conditions)) 

對於這些查詢中的每一個,MySQL都應該正確使用這些索引,這將會加速總執行時間的一個巨大因素。

OR在SQL中通常是邪惡的,應儘可能避免。

+0

謝謝,我一定會嘗試! 但是「StartDate = EndDate」呢? MySQL不必爲此做全表掃描嗎? –

+0

不,如果您已正確索引這兩列。 –

0

好的,謝謝你的幫助!我發現真正的問題在我的查詢中甚至不是OR(儘管我現在使用Thomas G的建議對其進行了優化),但是這是在JOIN中使用的另一個表中的索引不太理想的情況。

所以感謝胡安·卡洛斯·Oropeza提供的鏈接MySQL indexing tips!