2016-04-21 40 views
0

我有這個問題;我有兩張桌子,一張叫做tableA,另一張叫做tableB。由於多個日期字段導致的MySQL性能問題

兩個表之間有一個關係1:n,並且在兩個表中都有日期字段;讓我用一個例子

 
TableA 
id|dateA|others 

TableB 
id|id_tablea|dateb1|sold|dateb2 

這些表之間的連接是微不足道的,我的問題是,當我按日期篩選解釋;如要求,我必須使用d

1)dateb2當且僅當出售= 1(如果在表B記錄存在) 2)否則dateb1(如果在表B記錄存在) 3)datea1

這是查詢的一個例子:

 
SELECT * FROM 
tableA ta 
LEFT JOIN 
tableB tb on ta.id = tb.id_tablea 
WHERE 
(
if(tb.sold=1,tb.dateb2,(IFNULL(tb.dateb1,ta.datea1)) 
) 
BETWEEN 'INT1' AND 'INT2' 
AND > 
... 

我的問題是,這兩個表是非常大的,查詢需要很長的時間;我怎樣才能優化這個查詢?任何想法?

在此先感謝

+0

請檢查右側欄中列出的類似問題。你會看到人們採取的方法,從提供足夠的信息到優化是什麼。我們無法對您的查詢做任何事情,也不知道您要返回多少信息,您的條款中的「非常大」意味着什麼(我們有IT中的數字,我們可以用它來表達數量級別)以及MySQL在後面執行的操作場景+你的服務器的配置是什麼。 – Mjh

回答

0

一個想法可能是擺脫的if/else:

我認爲如果出售尚未1,dateb2無效或可攜帶任意值。只要售出!= 1,您就可以保持dateb2等於dateb1。然後,無論賣出是否設置,您都可以選擇dateb2。

您現在可以爲dateb2創建一個索引,這可能會提高性能。

如果上面的假設是錯誤的,您可以考慮增加一列dateb3,如果銷售== 1,則保留與dateb2相等,否則等於dateb1,並與dateb3上的索引一起使用。

相關問題