参考文章 like‘%xxxxx%‘性能优化
在这篇文章中,有这么段话:
这种方法还是第一次见到,一开始看还没看懂,什么叫客制化?instr函数又是什么?下面这个两个sql也没看懂。不得不说,工作后不常用的东西忘得越来越多了。
一,instr函数
instr函数为字符查找函数,其功能是查找一个字符串在另一个字符串中首次出现的位置。instr函数在Oracle/PLSQL中是返回要截取的字符串在源字符串中的位置
1 select instr('helloworld','l') from dual; --返回结果:3 默认第一次出现“l”的位置
2 select instr('helloworld','lo') from dual; --返回结果:4 即“lo”同时出现,第一个字母“l”出现的位置
3 select instr('helloworld','wo') from dual; --返回结果:6 即“wo”同时出现,第一个字母“w”出现的位置
二,解读sql
需要优化的sql
select * from test1 t where t.name like '%AQPZCH%';
通常的方法就不多赘述,现在我们说说原作者使用instr()函数来优化的思路。
第一步,为test1表来创建索引。索引列是字符串在name中第一次出现的位置。
create index idx_test1_n2 on test1(instr(name,'AQPZCH'));
当你要查询name中包含 AQPZCH 字符串时,不用再根据字符串来查找,只用根据字符串在name中第一次出现的位置来查,这样就能使用到索引。
select * from test1 t where instr(t.name,'AQPZCH') >0;
当然缺点也很明显,平时工作中不可能为每一个要查找的字符串建立索引,只针对特定的场景。
结尾:虽然这种方式用的很少, 但是对于我来说,属于是开阔了视野,咱也不一定费用用instr函数,用其他的也行呀,博客上的大佬们真是吧sql玩出花来了。