模糊查询索引失效问题

使用like进行模糊查询时,如果使用前缀通配符%[]形式会导致索引失效进行全表扫描

如果不想索引失效可以使用后缀通配符[]%

instr可以替代like进行模糊查询,但并不代表instr比like的效率高,使用后缀通配符的效率比instr高。

1
2
3
4
5
6
7
8

SELECT * FROM STU WHERE STUNAME LIKE '%张%';
就相当于
SELECT * FROM STU WHERE INSTR(STUNAME, '张') > 0;

SELECT * FROM STU WHERE STUNAME NOT LIKE '%张%';
就相当于
SELECT * FROM STU WHERE INSTR(STUNAME, '张') = 0;

总结:

<1> instr>0 和like、instr=0 和not like 一般来说查询的结果相同(不考虑特殊字符)

<2> instr是一个函数,可以建立函数索引,如果过滤的条件有索引,那么instr就可以提高性能。

<3> like查询时,以’%’开头,列所加的索引是不起作用的。

<4> 在没有索引的前提下,当数据量比较大时,instr要比like效率高。