讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql索引失效的常见场景有哪些_InnoDB底层B+树搜索原理

云伟小哥_9096

云伟小哥_9096

发布时间:2026-04-11 10:17:06

|

628人浏览过

|

来源于php中文网

原创

type=ALL明确表示未走索引,因优化器判定全表扫描优于索引查找,根本原因是B+树无法定位起始页,被迫线性遍历。

mysql索引失效的常见场景有哪些_innodb底层b+树搜索原理

为什么 EXPLAIN 显示 type=ALL 就代表索引没走

因为 type=ALL 表示 MySQL 决定全表扫描,跳过了所有可用索引。这不是“可能没走”,而是明确没用——哪怕你建了 5 个索引,只要执行计划里出现 type=ALL,就说明优化器判定走索引比扫全表更慢。
根本原因在于 InnoDB 的 B+ 树搜索必须从根节点逐层下降到叶子节点,而这个过程依赖「索引列是否能被直接比较」。一旦条件破坏了这个前提(比如加函数、类型不匹配、跳过左列),B+ 树就无法定位起始页,只能退化为线性遍历。
注意:key 字段为空或显示 NULL,也佐证了未命中索引。

WHERE name LIKE '%张' 为什么 B+ 树没法加速

B+ 树的叶子节点是按索引列值**严格排序**存储的,搜索依赖“有序性”做二分查找。而 LIKE '%张' 要求匹配任意前缀 + “张”,等价于在整棵树里找所有以“张”结尾的字符串——这完全打乱了排序逻辑,MySQL 无法通过树结构剪枝,只能挨个检查每条记录。
相比之下,LIKE '张%' 可以利用前缀有序性:先定位到第一个“张”开头的值,然后向右连续读取,直到超出“张”范围,这就是 B+ 树天然支持的范围扫描。
常见误判点:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • LIKE '%张%' 同样失效,不是因为含两个 %,而是因为开头通配符破坏了有序起点
  • COLLATE 设置不同(如 utf8mb4_bin vs utf8mb4_general_ci)可能导致隐式转换,间接触发失效

WHERE age > 25 AND name = '李四' 在联合索引 (age, name) 上为何 name 部分失效

这是 B+ 树结构决定的硬约束:联合索引本质是一棵按 age 排序、age 相同时再按 name 排序的单棵树。当查询带范围条件 age > 25,MySQL 只能定位到第一个 age=26 的叶子节点,然后向右顺序扫描所有 age > 25 的记录——此时 name 已不再全局有序,无法再用树结构快速跳转。
所以 name = '李四' 这个条件只能在扫描过程中逐行过滤,不参与索引查找。
关键细节:

  • 如果是 age = 25 AND name = '李四',就能精准定位单个叶子节点位置
  • 如果是 age BETWEEN 25 AND 30 AND name = '李四',同样只有 age 段参与索引定位,name 仍靠过滤
  • 想让 name 也生效,得把等值列放前面:索引改为 (name, age),但需权衡查询模式

WHERE id = '123' 对 INT 主键索引失效的底层原因

InnoDB 看到字符串 '123' 和 INT 类型的 id 列不匹配,会自动做隐式类型转换:把 id 列每一行都转成字符串再比较。这就等于在索引列上套了一层函数,B+ 树里存的是原始整数 123,而比较时却在查 '123' 的字符串形式——二者哈希值、字节序列完全不同,无法对齐。
同理,WHERE create_time = '2024-04-21'(create_time 是 DATETIME)也会触发类似转换,因为字符串字面量需解析为时间类型,本质仍是列上加函数。
真正安全的写法:

  • WHERE id = 123(数值字面量,类型一致)
  • WHERE create_time >= '2024-04-21' AND create_time (避免对列调用 <code>DATE())
  • 用 SHOW WARNINGS 查看是否有 Truncated incorrect DOUBLE value 类提示,那是类型转换的信号
B+ 树本身不复杂,但失效往往卡在“你以为它能推导,其实它只能机械匹配”这个点上。最易忽略的是隐式转换和范围后缀截断——它们不会报错,只默默变慢。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4383

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

911

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1149

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6321

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3143

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6300

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8561

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1170

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

100

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn