云计算百科
云计算领域专业知识百科平台

【高频面试题】为什么 `like ‘%‘`索引失效

前提:MySQL InnoDB,B + 树普通索引。

1. B + 树索引的底层特性

普通索引是按索引列的值从左往右有序排列。 比如字段 name 索引:

Alice | Bob | Charlie | David

B + 树的查找逻辑:从字符串最左边的字符开始匹配,快速缩小范围。

  • like 'Bob%':前缀匹配 知道开头是 Bob,直接在 B + 树找到Bob这一段,后面随便扫,可以走索引。
  • like '%Bob' / like '%Bob%':通配符在最前面 前面字符不确定,不知道从 B + 树哪个节点开始找。 索引是按左前缀排序的,没办法利用有序性快速定位,只能全表一条条拿出来再做字符串匹配,也就是全表扫描,索引失效。

一句话:B + 树索引只支持左前缀匹配,最左边是%,就没有前缀可以利用。

2. 容易混淆的几个点

✅ like 'key%' 可以走索引(前缀匹配)

❌ like '%key'、like '%key%' 普通 B + 树索引失效

注意:不是语法报错,是优化器放弃索引,选择全表扫描。 偶尔 explain 看到依然显示 using index,那是覆盖索引特例,不是通配符生效。

3. 那想要后缀 / 包含匹配怎么办?

  • 反向索引(MySQL 8.0+) 把字段反转存一个索引:
  • — 新增反转字段+索引
    alter table t add name_rev varchar(64);
    update t set name_rev = reverse(name);
    create index idx_name_rev on t(name_rev);

    — 查询 %abc 改成 reverse匹配
    select * from t where name_rev like reverse('%abc');

  • 全文索引 fulltext 适合%关键词%这种全文检索场景。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【高频面试题】为什么 `like ‘%‘`索引失效
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!