前提: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. 那想要后缀 / 包含匹配怎么办?
— 新增反转字段+索引
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');
网硕互联帮助中心



评论前必须登录!
注册