我有這樣的查詢:有什麼辦法,以加快使用CASE語句查詢?
SELECT id
FROM table
GROUP BY columnName, CASE WHEN columnName IS NULL THEN id ELSE 0 END
在GROUP
聲明CASE
聲明的目的是爲了防止與排在null
從COLUMNNAME(我使用到組行一起列值)進行分組一起。我只想組在一起有columnName
非空值的行。
問題是CASE
語句將查詢的執行時間從0.09s
增加到0.854s
,增加了約10倍。
使用EXPLAIN
,我可以看到,如果沒有CASE
語句,用於columnName
的指數,但與CASE
聲明沒有使用索引,這我假設就是爲什麼查詢變得如此慢得多?
有什麼辦法來防止CASE
聲明從這麼多拖慢查詢?例如,是否可以索引CASE
聲明?
我對SQL非常不熟悉,所以我能想到的唯一解決方案是創建另一個列,名稱類似columnName_or_id
,並在我的軟件中包含邏輯,在插入行後將另一個查詢放入id
到columnName_or_id
,如果稍後將值插入columnName
也將該值插入到columnName_or_id
(因此,新列的名稱,因爲它包含行id
或columnName
值)。這將消除在查詢CASE
聲明的必要性。
有沒有更好的方法?
不要UNION打破索引? –
@RobertHarvey。 。 。不是我的知識。子查詢應該使用適當的索引。 –
這是一個明顯的改進。它將執行時間減少到「0.244s」 - 仍然比原始查詢慢3倍,但比「CASE」方法快3.5倍。 – Nate