news 2026/4/25 21:41:14

面试官: MySQL LIKE索引失效原因解析(答案深度解析)持续更新

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试官: MySQL LIKE索引失效原因解析(答案深度解析)持续更新

面试题:LIKE为什么会失效?——索引失效的底层逻辑与实战避坑指南

⚠️ 这是 MySQL 索引优化中高频踩坑点,90% 的候选人只答出“以%开头就失效”,但面试官真正想听的是:为什么失效?底层发生了什么?有没有例外?怎么验证?


一、概念解释:LIKE失效 ≠LIKE不能用,而是「索引失效」

  • LIKE是 SQL 模糊匹配操作符,语法:column LIKE pattern
  • 「失效」特指:MySQL 无法使用 B+ 树索引快速定位数据,被迫退化为全表扫描(Full Table Scan)
  • 关键结论先行:
    LIKE 'abc%'可用索引(最左前缀匹配)
    LIKE '%abc'索引失效(无法定位起始位置)
    ⚠️LIKE '%abc%'索引失效(两端模糊,无起点可言)

二、原理说明:B+ 树索引的「有序性」是核心约束

MySQL 的 InnoDB 引擎使用B+ 树索引,其本质是有序数组 + 多路搜索树。索引能加速查询,前提是能「从某个确定的起点开始向右遍历」。

🔍 举个真实例子(假设name字段有 B+ 树索引):

CREATETABLEuser(idINTPRIMARYKEY,nameVARCHAR(50),INDEXidx_name(name));-- 插入数据(按字典序存储在 B+ 树叶子节点):-- 'Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'
  • WHERE name LIKE 'Da%'
    → MySQL 找到第一个>= 'Da'的记录(即'David'),然后向右顺序扫描所有以'Da'开头的值高效!

  • WHERE name LIKE '%vid'
    → 要找结尾是'vid'的名字(如'David','Livid'),但 B+ 树只按完整字符串排序,不存反向索引。
    → MySQL 无法知道'vid'在哪个分支,只能从根节点一路查到所有叶子节点 →全表扫描!

💡 类比理解:就像查《新华字典》——

  • 查「张*」→ 翻到「张」部首,往后扫即可(✅)
  • 查「*伟」→ 你得把整本字典每个字都看一遍末笔是不是「伟」(❌)

三、示例代码:用EXPLAIN验证索引是否生效

-- 建表 & 插入测试数据CREATETABLEproduct(idINTPRIMARYKEY,titleVARCHAR(100),INDEXidx_title(title));INSERTINTOproductVALUES(1,'iPhone 15 Pro'),(2,'Samsung Galaxy S24'),(3,'Xiaomi 14 Ultra');-- ✅ 查看执行计划:key = idx_title → 索引命中EXPLAINSELECT*FROMproductWHEREtitleLIKE'iPhone%';-- ❌ key = NULL → 索引失效,type = ALL(全表扫描)EXPLAINSELECT*FROMproductWHEREtitleLIKE'%Pro';-- ⚠️ 即使加了索引,以下也失效(注意:MySQL 8.0+ 对 `LIKE '%abc%'` 仍无法用索引)EXPLAINSELECT*FROMproductWHEREtitleLIKE'%Galaxy%';

📌 面试加分点:

  • LIKE 'abc%'LIKE 'abc_'(下划线单字符)都能走索引;
  • LIKE 'ab%c'(中间通配)→同样失效!因为'ab%c'不满足最左前缀连续性(B+ 树无法跳过中间段继续匹配)。

四、常见误区(面试官最爱追问!)

误区正解为什么错?
❌ “只要用了%就一定失效”✅ 只有%模式开头才必然失效;'abc%'完全可用索引忽略了 B+ 树「从左到右匹配」的本质
❌ “加了索引就一定能加速 LIKE”✅ 索引类型很重要!普通 B+ 树对%abc无效;但全文索引(FULLTEXT)或倒排索引(如 Elasticsearch)可支持后缀匹配混淆了不同索引结构的能力边界
❌ “LIKE失效只能靠改 SQL”✅ 可用函数索引(MySQL 8.0+)生成列+索引ALTER TABLE product ADD COLUMN title_rev VARCHAR(100) AS (REVERSE(title)) STORED, ADD INDEX idx_rev (title_rev);→ 查询WHERE REVERSE(title) LIKE 'orP%'忽略了高版本 MySQL 的高级优化手段

五、生产建议:不止于“别写%abc

  • 优先用前缀匹配:设计字段时预留可索引的前缀(如订单号ORD20240515XXXXX,查LIKE 'ORD20240515%'
  • 后缀需求 → 改存储:存正向 + 反向两列,或用 Redis 做模糊缓存
  • 大数据量模糊搜索 → 上专业方案:Elasticsearch / Solr(基于倒排索引,天生支持任意位置匹配)
  • 必须用%abc?加 LIMIT + 覆盖索引减少回表(虽仍全表扫,但至少不查磁盘行数据)

🎯终极总结一句话
LIKE失效不是LIKE的锅,而是你在要求 B+ 树做它做不到的事——它是一棵按完整值排序的树,不是一台万能模糊匹配引擎。理解索引结构,才能写出真正高效的 SQL。
更多Java面试题整理:

JVM面试题
MySQL面试题
Redis面试题
Spring面试题

完整面试题库:
https://myquotego.com/html/questions?_from=csdn_123_4

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 21:35:24

Moonlight串流全屏终极指南:iPad无边框设置详解

1. 为什么你的Moonlight串流总有黑边? 每次用iPad串流PC游戏时,屏幕两边那两条黑边是不是让你特别烦躁?我刚开始用Moonlight的时候也遇到过同样的问题,折腾了好几天才找到完美解决方案。其实问题的核心很简单:分辨率不…

作者头像 李华
网站建设 2026/4/16 23:01:12

Windows风扇控制终极指南:FanControl免费软件让电脑散热更智能

Windows风扇控制终极指南:FanControl免费软件让电脑散热更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tre…

作者头像 李华
网站建设 2026/4/16 22:57:26

CTF安全竞赛能力矩阵

CTF能力矩阵 类别 工具/库 状态 考点覆盖 Web安全 nmap, nikto, gobuster, sqlmap, curl ✅ SQL注入、XSS、目录遍历、文件上传 密码学 pycryptodomex, hashlib ✅ 哈希破解、编码转换、RSA/AES…

作者头像 李华
网站建设 2026/4/16 22:53:39

【项目实战】Windows 10 Docker Desktop 安装前置条件检测与解决方案

Docker Desktop 安装前置条件检测与解决方案 一、报错内容 在 Windows 10 LTSC 企业版环境下安装 Docker Desktop 前,执行系统兼容性检测时发现以下问题: 1. CPU 虚拟化未启用 CPU: Intel(R) Core(TM) i5-13500H Virtualization: FalseBIOS 中 Intel VT-x 虚拟化技术未开…

作者头像 李华
网站建设 2026/4/16 22:52:39

FPGA实战:手把手教你用Verilog驱动AD9833生成3KHz正弦波(附完整代码)

FPGA实战:从零开始用Verilog驱动AD9833生成精准3KHz正弦波 第一次接触AD9833这款DDS芯片时,看着密密麻麻的时序图和寄存器配置说明,我对着开发板发呆了半小时。直到把示波器探头接上输出引脚,看到那个完美的正弦波曲线时&#xff…

作者头像 李华
网站建设 2026/4/16 22:49:14

第211章:文明的“成年礼”(墨子)

“普罗米修斯计划”的定向广播,如同将一颗蕴含着人类文明精华的种子,奋力抛向无垠的宇宙深空。执行计划的团队,包括墨子本人,对于这微弱的呼唤是否能得到回应,何时能得到回应,内心深处并未抱有任何不切实际…

作者头像 李华