我有这样的查询:
SELECT id
FROM table
GROUP BY columnName, CASE WHEN columnName IS NULL THEN id ELSE 0 END
CASE
语句中GROUP
语句的目的是阻止columnName中的null
行(我用来将行组合在一起的列值)组合在一起。我只想将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
语句的需要。
有更好的方法吗?
答案 0 :(得分:2)
GROUP BY coalesce(columnName, id)
答案 1 :(得分: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
。