ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

【高频面试题】为什么 `like ‘%‘`索引失效 前提MySQL InnoDBB 树普通索引。1. B 树索引的底层特性普通索引是按索引列的值从左往右有序排列。 比如字段name索引Alice | Bob | Charlie | DavidB 树的查找逻辑从字符串最左边的字符开始匹配快速缩小范围。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适合%关键词%这种全文检索场景。
返回列表