sql like模糊查询与索引

目录

        • 一、like与索引
        • 二、优化like查询
        • 三、查询 %xx 的记录

一、like与索引
  1. like %keyword
    索引失效,使用全表扫描。但可以通过翻转函数 + like前模糊查询 + 建立翻转函数索引 = 走翻转函数索引,不走全表扫描。
  2. like keyword%
    索引有效
  3. like %keyword%
    索引失效,也无法使用反向索引。
二、优化like查询

使用下面的函数来进行模糊查询,如果出现的位置 > 0,则表示包含该字符串。查询效率比 like 要高。
例如: table.field like “%AAA%” 可以改为 LOCATE(“AAA”,table.field) > 0

  1. LOCATE(substr,str)
    返回子串 substr 在字符串 str 中第一次出现的位置,没有则返回0。
    SELECT *
    FROM t_blog t
    WHERE LOCATE("xxx",t.field) > 0
    
  2. POSITION(substr IN str)
    返回子串 substr 在字符串 str 中第一次出现的位置,没有则返回0。position 是 locate 的别名。
    SELECT *
    FROM t_blog t
    WHERE POSITION("xxx" IN t.field) > 0
    
  3. 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值的降低。

你可能感兴趣的:(随笔,sql)