有没有办法使用CASE语句加速查询?

时间:2014-01-11 17:27:35

标签: mysql sql indexing case

我有这样的查询:

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(因此新列的名称也是如此)包含行idcolumnName值)。这将消除查询中CASE语句的需要。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

尝试COALESCE()

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