一、like与索引
- like %keyword
索引失效,使用全表扫描。但可以通过翻转函数 + like前模糊查询 + 建立翻转函数索引 = 走翻转函数索引,不走全表扫描。 - like keyword%
索引有效 - like %keyword%
索引失效,也无法使用反向索引。
二、优化like查询
使用下面的函数来进行模糊查询,如果出现的位置 > 0,则表示包含该字符串。查询效率比 like 要高。
例如: table.field like “%AAA%” 可以改为 LOCATE(“AAA”,table.field) > 0
- LOCATE(substr,str)
返回子串 substr 在字符串 str 中第一次出现的位置,没有则返回0。SELECT * FROM t_blog t WHERE LOCATE("xxx",t.field) > 0
- POSITION(substr IN str)
返回子串 substr 在字符串 str 中第一次出现的位置,没有则返回0。position 是 locate 的别名。SELECT * FROM t_blog t WHERE POSITION("xxx" IN t.field) > 0
- INSTR(str,substr)
返回子串 substr 在字符串 str 中第一次出现的位置,没有则返回0。这和 LOCATE() 的双参数形式相同,只是参数的顺序相反。SELECT * FROM t_blog t WHERE INSTR(t.field,"xxx") > 0
三、查询 %xx 的记录
SELECT t.title
FROM t_blog t
WHERE t.title LIKE "%java"
在执行的时候,执行计划显示,消耗值,io值,cpu值均非常大,原因是 like后模糊查询 导致索引失效,进行全表扫描。
解决方法:这种只有前模糊查询的sql可以改造为如下写法
SELECT t.title
FROM t_blog t
WHERE REVERSE(t.title) LIKE REVERSE("%java)"
使用 翻转函数 + like前模糊查询 + 建立翻转函数索引 = 走翻转函数索引,不走全扫描。有效降低消耗值,io值,cpu值这三个指标,尤其是io值的降低。