问题
业务中遇到一个非常慢的查询,大致可以简化为以下SQL
:
|
|
其中:
-
有索引且命中的条件已简化掉了
-
c5
为自定义格式的时间字符串 -
c2
和c5
有索引(普通索引),c1
、c3
和c4
无索引 -
c3
和c4
为绑定条件 -
c1
、c3
和c4
均为小值域列
分析
-
not in
和not like
会导致普通索引失效 -
为
小值域列
添加普通索引无法提供预期的效果 -
c3
和c4
为绑定条件,且条件固定不变,视为一体进行处理的话,可一定程度上扩充列的值域 -
c5
虽然已有索引,但字符串比较
操作还是太低效
解决方案
基于以上特殊的情形,搜索并尝试后发现,函数索引
恰好可以达到预期,而使用的数据库又刚好支持(Oracel
和PostgreSQL
完全支持)。
添加索引
-
将
c1
的not in
手动改为in
查询,即可利用已有索引 -
c2
的not like
为后模糊查询,为其创建函数索引
:
|
|
- 为
c3
和c4
的绑定条件创建函数索引
:
|
|
c5
不能改变表数据类型,但可以转换为时间类型
,为转换后的时间类型创建索引,即为c5
创建函数索引
:
|
|
修改查询
添加索引后,还需要按照索引使用相同的函数来改造条件语句,最终优化后的SQL
:
|
|
效果
清除缓存测试,原查询大约需要57s
,优化后大约13s
。