2014-01-11 36 views
0

我有這樣的查詢:有什麼辦法,以加快使用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,並在我的軟件中包含邏輯,在插入行後將另一個查詢放入idcolumnName_or_id,如果稍後將值插入columnName也將該值插入到columnName_or_id(因此,新列的名稱,因爲它包含行idcolumnName值)。這將消除在查詢CASE聲明的必要性。

有沒有更好的方法?

回答

1

也許這將是快在這種情況下做了union all

(SELECT id 
FROM table 
WHERE columnName is not null 
GROUP BY columnName 
) 
union all 
(select id 
from table 
where columnName is null 
) 

如果where columnName is not null防止使用索引,然後嘗試having columnName is not null

+0

不要UNION打破索引? –

+0

@RobertHarvey。 。 。不是我的知識。子查詢應該使用適當的索引。 –

+0

這是一個明顯的改進。它將執行時間減少到「0.244s」 - 仍然比原始查詢慢3倍,但比「CASE」方法快3.5倍。 – Nate

2

嘗試COALESCE()

GROUP BY coalesce(columnName, id) 
+0

我只是試了一下,執行時間是'0.808s',所以沒有改善,不幸的是。 – Nate