mysql like也是b+Tree索引吗

发布时间:2026/10/19 13:35:33

mysql like也是b+Tree索引吗 like也是bTree索引吗一、直接回答是的当 LIKE 查询能用到索引时用的就是 BTree 索引因为 MySQL 中默认的索引结构就是 BTree。但关键在于BTree 的有序性决定了什么样的 LIKE 查询能用索引。二、BTree 为什么支持 LIKE ‘abc%’1. BTree 的有序特性-- 假设 name 列的值有张三、李四、王五、张伟、张强-- 在 BTree 中存储顺序是李四,王五,张三,张伟,张强-- 按字符串排序-- BTree 结构示意[王五]/\[李四][张...]/\[张三][张伟,张强]2. 前缀匹配的执行过程-- 查询WHERE name LIKE 张%EXPLAINSELECT*FROMusersWHEREnameLIKE张%;-- BTree 执行步骤-- 1. 在索引树中找到第一个以张开头的值定位到张三-- 2. 顺序扫描直到遇到不是以张开头的值-- 3. 这个过程利用了 BTree 叶子节点的链表结构-- 相当于执行了SELECT*FROMusersWHEREname张ANDname郑-- 郑是张的下一个首字三、BTree 为什么不支持 LIKE ‘%abc’1. 有序性的限制-- 查询WHERE name LIKE %三-- 原因BTree 索引是基于完整字符串排序的-- 无法通过索引直接找到以三结尾的记录-- 索引中的值李四, 王五, 张三, 张伟, 张强-- ↑ ↑-- 找不到以三结尾的起点 也不知道终点-- 只能全表扫描2. 可以这样理解-- BTree 索引就像电话簿按姓氏排序-- ✅ 快速找到所有姓张的人前缀匹配-- ❌ 无法快速找到名字叫三的人后缀匹配四、BTree 索引在 LIKE 中的实际工作方式1. 索引条件下推ICP-- MySQL 5.6 引入的优化CREATEINDEXidx_name_ageONusers(name,age);-- 查询SELECT*FROMusersWHEREnameLIKE张%ANDage20;-- 执行过程Without ICP-- 1. 用索引找到所有以张开头的记录10万条-- 2. 回表读取完整数据-- 3. 在 server 层过滤 age 20-- 执行过程With ICP-- 1. 用索引找到以张开头的记录-- 2. 在存储引擎层直接用索引中的 age 字段过滤-- 3. 只对过滤后的少量记录回表2. 索引覆盖扫描-- 创建覆盖索引CREATEINDEXidx_nameONusers(name,email);-- 查询只返回索引中的字段SELECTname,emailFROMusersWHEREnameLIKE张%;-- Extra: Using index不需要回表-- 因为查询的所有字段都在索引中五、BTree 索引在 LIKE 中的性能分析1. 不同情况下的扫描范围-- 数据分布100万条记录-- 假设姓张的有 1万条-- 情况1LIKE 张%-- 索引扫描范围从第一个张到最后一个张-- 扫描记录数约 1万条-- 性能很快-- 情况2LIKE 张三%-- 索引扫描范围从第一个张三到最后一个张三-- 扫描记录数可能只有几百条-- 性能更快-- 情况3LIKE %三-- 索引扫描范围整个索引100万条-- 但 BTree 扫描整个索引也很慢还不如全表2. 范围估算-- 查看索引统计信息SHOWINDEXFROMusers;-- Cardinality 字段表示区分度-- 估算匹配行数EXPLAINSELECT*FROMusersWHEREnameLIKE张%;-- rows 字段会显示预估的扫描行数六、BTree 索引的局限性和弥补方案1. 局限性-- BTree 无法优化的场景SELECT*FROMarticlesWHEREcontentLIKE%数据库%;SELECT*FROMproductsWHEREdescriptionLIKE%手机%;SELECT*FROMlogsWHEREmessageLIKE%ERROR%;2. 弥补方案-- 方案1全文索引内部用倒排索引不是 BTreeALTERTABLEarticlesADDFULLTEXT(content);SELECT*FROMarticlesWHEREMATCH(content)AGAINST(数据库);-- 方案2搜索引擎ElasticSearch-- 使用倒排索引专门优化全文搜索-- 方案3反向字段索引用 BTree 间接实现ALTERTABLEusersADDreverse_emailVARCHAR(255)GENERATED ALWAYSAS(REVERSE(email))STORED;CREATEINDEXidx_reverse_emailONusers(reverse_email);-- 现在可以查后缀WHERE reverse_email LIKE REVERSE()七、BTree 索引在不同 LIKE 模式下的表现LIKE 模式BTree 使用情况扫描方式效率‘abc%’✅ 使用索引范围扫描高‘a%c’✅ 使用索引范围扫描 过滤中高‘a_c’✅ 使用索引范围扫描 过滤中‘%abc’❌ 不使用全表扫描低‘%abc%’❌ 不使用全表扫描极低‘_abc’❌ 不使用全表扫描低八、总结BTree 索引在 LIKE 中的工作原理利用有序性通过 BTree 的树状结构快速定位起点利用链表通过叶子节点的链表顺序扫描利用 ICP在索引层面过滤减少回表利用覆盖索引避免回表关键结论LIKE ‘abc%’ 能用 BTree 索引利用前缀有序性LIKE ‘%abc’ 不能用 BTree 索引后缀无序BTree 不是万能的需要其他技术全文索引、ES弥补一句话理解BTree 索引就像一本按拼音排序的字典可以快速找到以某个拼音开头的所有字但没法找到以某个拼音结尾的字。
延伸阅读

更多相关文章

2026/10/17 18:41:34

Live2D模型集成实战:从原理到Web与Unity跨平台部署

最近在逛一些技术社区和开源项目时,我发现一个有趣的现象:越来越多的开发者,尤其是独立游戏开发者和虚拟主播技术栈的从业者,开始热衷于将高质量的 Live2D 模型集成到自己的项目中。这背后反映的,远不止是“让角色动起…

2026/10/18 10:03:44

构建高可玩性无人机虚拟座舱:从概念到Unity实践

在实际无人机开发与模拟训练领域,虚拟座舱技术正成为连接软件仿真与硬件操作的关键桥梁。它不仅仅是飞行数据的可视化界面,更是开发者进行算法验证、飞控调试以及用户体验设计的核心平台。对于“影翎无人机”这类强调“AG向自由飞”(即反重力…

2026/10/14 17:45:47

LangChain:ChatModel 聊天模型与可配置模拟器

目录 一、什么是聊天模型 1.1 什么是消息 1.2 模型的分类 1.2.1 真实聊天模型 1.2.2 可配置模拟器模型 1.3 与LLM的区别 1.4 注意事项 二、通过API来定义聊天模型 2.1 ChatDeepSeek 2.2 init_chat_model 2.2.1 函数定义 2.2.2 实例1:创建无配置模型 2.…

2026/10/19 14:04:20

SAP-PP替代物料五类工程模式与配置避坑指南

简介:本资源是一份面向SAP PP模块实施顾问、生产计划员及系统运维人员的实操型技术手册,聚焦SAP中替代物料的核心配置与业务场景落地。针对生产过程中因物料短缺需动态切换(如A用完自动切B、A/B按30%/70%比例共用)等典型问题&…

2026/10/19 14:04:20

开源RAG系统搭建与调优实战:从选型到生产落地

1. 为什么我最终选择了开源RAG方案——一次从商业API到自建系统的迁移实录 先交代一下背景。我之前在某公司负责内部知识库的智能化改造,核心需求其实非常简单:让业务同事可以直接用自然语言提问,系统从几十万份产品文档、售后工单和FAQ里找出…

2026/10/19 14:04:20

自己搭建开源代码审查方案:从选型到落地的完整实践

1. 为什么我会自己搭一套开源代码审查方案,而不是直接买商业工具先交代一下背景。团队从去年开始把代码审查从“随缘看两眼”往“强制门禁”的方向推,过程并不顺利。GitLab上虽然开了MR模板,PR描述里也加了自检清单,但实际review质…

2026/10/19 14:04:20

企业级RAG+Agent编排:从多表查询到多轮对话的落地实践

业务同学在群里问了一个看起来很普通的问题:"上个月华东区的退货率为什么比华北区高?帮我查查原因,顺便翻一下上月退货处理报告。"这个问题的麻烦在于,它同时牵扯了三件事:先要在订单表和退货表之间做关联计…

2026/10/19 13:59:18

open-code-review:基于CLI与LLM Agent的自动化代码评审新范式

1. 什么是 open-code-review:一个被严重低估的工程实践新范式“open-code-review”这个词最近在开发者社区里频繁出现,但它不是某个具体工具的名字,也不是某家公司的私有产品,而是一种正在快速成型的、以开放性、自动化和可追溯性…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/19 0:04:56

悟空开源无代码平台实战:从实体建模到应用设计避坑指南

简介:基于悟空开源无代码平台的多种应用设计源码,面向希望在不编写代码的情况下快速搭建CRM、HRM、财务系统、ERP、SRM等业务应用的企业与技术人员,通过拖放式界面和内置模板即可完成应用定制与部署。压缩包共697个文件,约10.74MB…

2026/10/19 0:04:56

基于.NET9的多租户权限系统:数据权限与动态API落地实践

简介:这份资源是一套面向 .NET 与 Vue 全栈开发者的中台权限管理系统,后端基于 .Net9,前端采用 Vue3 Element Plus,并配套 uniapp uviewui 移动端方案,实现前后端分离。系统覆盖多租户隔离、数据权限、动态 Api、任务…

2026/10/19 0:04:56

场地预约小程序毕设实战:SSM+微信小程序+MySQL数据库设计到避坑

简介:面向毕业设计场景的场地预约小程序完整项目,基于微信小程序SSMMySql技术栈开发,适合计算机相关专业学生作为选题参考、功能扩展或二次开发起点。系统实现场地类型管理、场地管理、预约管理、取消申请与押金退回等功能,分为管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑