我有这样的查询:有什么办法,以加快使用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