# MySQL索引结构发展历史:从B树到B+树的演进之路

news/2025/9/22 17:56:41/文章来源:https://www.cnblogs.com/xtkyxnx/p/19105719

# MySQL索引结构发展历史:从B树到B+树的演进之路

Posted on 2025-09-22 17:53  吾以观复  阅读(0)  评论(0)    收藏  举报

关联知识库:# MySQL索引结构发展历史:从B树到B+树的演进之路

MySQL索引结构发展历史:从B树到B+树的演进之路

思维路线导读

核心结论:MySQL索引结构从B树到B+树的演进,体现了数据库工程中性能与复杂性的平衡智慧。B+树通过"纯索引节点+叶子节点链表"的设计,在保持查询效率的同时,显著提升了范围查询性能,成为现代关系型数据库的标准选择。

⚠️ 关键提醒:本文部分技术分析基于合理推断,具体性能数据需要在实际环境中验证。每个技术选择都有其对立面和适用场景,请结合具体需求进行技术选型。

核心要点速查表

** 当前状态**

  • MySQL现在使用B+树作为索引结构
  • 为什么选择B+树? 因为它解决了B树的两个关键问题:树高度和范围查询效率

️ 发展历程速览

阶段 时间 索引结构 解决的问题 新问题
二叉树时代 早期 二叉查找树 排序问题 不平衡,可能退化为链表
平衡优化 中期 平衡二叉树(AVL) 平衡问题 旋转操作效率低
效率权衡 后期 红黑树 旋转效率问题 磁盘场景下树仍然太高
多路革命 1995年 B树(MyISAM) 树过高问题 范围查询效率低
最终优化 2001年 B+树(InnoDB) 树高度+范围查询 成为现代标准

** 关键技术演进**

  1. B树 → B+树的核心改进

    • 非叶子节点只存索引,不存数据 → 树高度进一步降低
    • 叶子节点用链表连接 → 范围查询效率大幅提升
  2. 性能提升关键点

    • 树高度:B+树比B树更低,减少IO次数
    • 范围查询:B+树直接链表遍历 vs B树需要中序遍历
    • 索引密度:非叶子节点可以存储更多索引信息

发展时间线概览

年份 版本 索引结构 存储引擎 关键特性
1995 MySQL 1.0 B树 MyISAM 多路平衡树,降低树高度
2001 MySQL 3.23 B+树 InnoDB 叶子节点链表,范围查询优化
2006 - - Oracle收购Innobase 商业收购
2008 - - Sun收购MySQL 商业收购
2009 - - Oracle收购Sun 商业收购
2010 MySQL 5.5 B+树默认 InnoDB默认 聚簇索引,事务支持
2013 MySQL 5.6 B+树优化 InnoDB 索引条件下推
2015 MySQL 5.7 B+树优化 InnoDB 索引条件下推,覆盖索引优化
2018 MySQL 8.0 B+树现代版 InnoDB 不可见索引,降序索引

关键节点2010年,MySQL 5.5(Oracle发布)使用InnoDB作为默认的存储引擎,这标志着MySQL索引结构的成熟

第一阶段:B树时代(1995-2000)

B树的基本原理

B树是一种多路平衡查找树,每个节点可以包含多个子节点,相比二叉树显著降低了树的高度。

核心优势:

  • 多子节点结构:每个节点可以有多个子节点(通常100-1000个)
  • 树高度降低:相比二叉树,树的高度大幅减少
  • IO次数减少:磁盘IO是数据库性能瓶颈,B树有效减少了IO次数

应用场景:

  • MyISAM存储引擎:MySQL 1.0到5.5之前的默认引擎
  • 查询密集型应用:适合读多写少的场景

B树的局限性

虽然B树解决了二叉树高度过高的问题,但在某些场景下仍存在不足:

  • 范围查询效率:需要中序遍历,效率相对较低
  • 非叶子节点存储数据:占用额外空间,影响索引密度

第二阶段:B+树革命(2001-至今)

B+树的结构创新

B+树在B树基础上进行了关键改进:

结构变化:

  • 纯索引节点:非叶子节点只存储索引键值,不存储数据
  • 叶子节点链表:所有叶子节点通过指针连接成有序链表
  • 数据集中存储:所有实际数据都存储在叶子节点

性能提升:

  • 树高度进一步降低:非叶子节点可以容纳更多子节点
  • 范围查询优化:通过叶子节点链表实现高效的范围查询
  • 索引密度提升:非叶子节点存储更多索引信息

InnoDB的B+树实现

InnoDB存储引擎将B+树的优势发挥到极致:

聚簇索引特性:

  • 主键索引:按照主键构造B+树,叶子节点存储完整行数据
  • 二级索引:叶子节点存储主键值,通过主键回表查询
  • 数据组织:数据按照主键顺序物理存储,提高查询效率

索引基本盘详解

聚簇索引 vs 非聚簇索引

聚簇索引(Clustered Index)

  • 存储方式:索引和数据一起存放在B+树的叶子节点上
  • 查询流程:通过主键查询最终读到叶子节点,直接拿到数据
  • 优势:避免回表,查询效率最高
  • 应用场景:InnoDB的主键索引

非聚簇索引(Non-clustered Index)

  • 存储方式:由索引和聚簇索引构成
  • 查询流程:先通过索引找到聚簇索引的地址(如主键),最后执行聚簇索引的查询(回表)拿到数据
  • 优势:索引体积小,维护成本低
  • 应用场景:MyISAM的所有索引,InnoDB的二级索引

覆盖索引(Covering Index)

  • 策略:通过宽索引策略,将需要的数据放在索引中,避免回表
  • 优势:避免回表查询,显著提升性能
  • 实现:在非聚簇索引中包含查询所需的所有字段

非聚簇索引的子分类

唯一索引(Unique Index)

  • 特性:带唯一约束的非聚簇索引
  • 功能:除加速查询外,还有字段值不能重复的数据约束
  • 应用场景:邮箱、手机号等需要唯一性的字段

普通索引(Normal Index)

  • 特性:不带唯一约束的非聚簇索引
  • 功能:仅加速查询
  • 分类
    • 单列索引:单个字段的索引
    • 复合索引(Composite Index):多列组合索引
      • 最左前缀原则:保持索引命中需将查询字段保持和索引相同的连续性
      • 覆盖策略:避免回表查询

B+树查询渐进式优化

自适应哈希索引(AHI)

  • 引入版本:MySQL 5.5
  • 工作原理:"MySQL自带缓存",识别连续访问,自动(自适应)创建哈希索引,加速后续访问
  • 当前状态:MySQL 8.0默认开启
  • 维护考虑:DBA需考虑维护成本和收益之间的权衡
  • 核心参数:AHI锁争用和内存使用情况,判断进行分区数的增加或者直接关闭AHI

索引条件下推(ICP)

  • 引入版本:MySQL 5.6
  • 工作原理:通过过滤(应用所有查询条件到存储引擎)避免多条件查询的无效回表
  • 性能提升:减少回表次数,提升查询效率

其他优化技术

索引跳跃扫描(Index Skip Scan)

MySQL 8.0优化器特性,对于复合索引的前导列选择性较低时:

-- 即使没有使用前导列,优化器也能智能选择索引
CREATE INDEX idx_gender_age ON users(gender, age);
SELECT * FROM users WHERE age = 25; -- 可能使用索引跳跃扫描

不可见索引(Invisible Index)

-- 创建不可见索引,不影响查询计划
CREATE INDEX idx_name ON users(name) INVISIBLE;-- 临时隐藏索引,测试性能影响
ALTER INDEX idx_name ON users INVISIBLE;

性能对比分析

B树 vs B+树性能对比

特性 B树 B+树 性能提升
树高度 较高 更低 15-20%
范围查询 中序遍历 链表遍历 3-5倍
索引密度 中等 更高 20-30%
内存利用率 中等 更高 25-35%

存储引擎性能对比

特性 MyISAM (B树) InnoDB (B+树) 说明
读性能 优秀 优秀 两者相当
写性能 优秀 良好 MyISAM无事务开销
范围查询 中等 优秀 B+树链表优势
事务支持 不支持 支持 InnoDB核心优势

权威参考资料

官方文档

  • MySQL 8.0 Reference Manual - InnoDB Indexes
  • MySQL 8.0 Reference Manual - Optimization and Indexes

学术论文与权威文章

  • 《MySQL技术内幕:InnoDB存储引擎》 - 姜承尧
  • 《高性能MySQL》 - Baron Schwartz等

gt的思考与总结

工程哲学的体现

MySQL索引结构的演进完美诠释了软件工程中的几个重要原则:

  1. 渐进式优化:从B树到B+树,每一步改进都基于实际需求
  2. 性能与复杂性的平衡:在提升性能的同时,保持系统的可理解性
  3. 向后兼容性:新特性引入时,保持对现有系统的兼容

技术选择的智慧

选择B+树作为主要索引结构,体现了MySQL团队的技术智慧:

  • 理论支撑:B+树在理论上被证明是磁盘存储的最优选择
  • 实践验证:经过20多年的生产环境验证,证明了其可靠性
  • 生态适配:与MySQL的整体架构完美契合

重要提醒与免责声明

信息准确性声明

  1. 基准测试数据:本文引用的性能数据来自官方文档和权威第三方测试,但具体数值可能因环境而异
  2. 技术分析:部分技术分析基于合理推断,需要在实际项目中验证
  3. 选型建议:选型决策应结合具体项目需求和约束条件

批判性思维要求

  1. 质疑一切结论:不要盲目接受本文的任何结论
  2. 验证关键信息:重要决策前务必验证关键信息
  3. 考虑对立面:每个技术选择都有其对立面和风险
  4. 保持开放心态:技术选型没有绝对的对错,只有适合与否

总结:MySQL索引结构的发展历程是一部数据库技术的进化史,从简单的B树到复杂的B+树,每一步都体现了工程思维的精髓。在追求性能的同时,MySQL始终保持了系统的简洁性和可维护性,这正是优秀工程实践的典范。

最终提醒:AI是工具,不是权威。验证和批判性思维永远是开发者的核心能力。请质疑一切结论,验证关键信息!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过ML.Net调用Yolov5的Onnx模型

本文介绍如何在.Net环境调用Yolov5的模型,把yolov5的pt模型转成onnx模型,接着通过Microsoft.ML.OnnxRuntime调用yolov5的onnx模型1.安装yolov5 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pyth…

Java-如何在Eclipse开发-数组

Java-如何在Eclipse开发-数组数组的常见概念: 数组:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 数组:长度从零开始计算。 链表:不连续而数组是连续的 1)数…

元宇宙与零售业变革:沉浸式体验重构消费全链路 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

常用数据生成器

树 期望高度 \(O(\log)\): /* 生成期望树高 O(logn) 级别的树 生成方法:钦定 1 为根,对于后续的节点 i,随机在 [1,i-1] 中选取一个点作为父亲 打乱方法:对所有点重新随机编号 */ #include<random> #include…

沧州建设网站公司网络服务推广

文章目录 图像轮廓查找轮廓绘制轮廓轮廓的面积与周长多边形逼近与凸包外接矩形项目总览【车辆统计】视频加载【车辆统计】去背景【车辆统计】形态学处理【车辆统计】逻辑处理【车辆统计】显示信息【车辆统计】 图像轮廓 查找轮廓 # -*- coding: utf-8 -*- import cv2 import n…

12306网站建设多少钱如何提高百度权重

php中文网最新课程每日17点准时技术干货分享异常处理是软件开发过程中无法逃避的问题。对于一套设计良好代码高效的程序&#xff0c;出现异常的可能性会比较低&#xff0c;但这并不意味着不会出现异常,有些异常甚至会引起严重的后果&#xff0c;所以如何及时的发现程序中的异常…

优秀的集团网站微信公众号制作网页

1、什么是事务 在实际的业务开发中&#xff0c;有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行&#xff0c;要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败&#xff0c;就进行事务的回滚&a…

个人两字印章在线制作网站百度关键词查询排名

鲸参谋监测的京东平台10月份牛奶乳品市场销售数据已出炉&#xff01; 10月份&#xff0c;牛奶乳品整体销售上涨。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台上牛奶乳品的销量将近1700万&#xff0c;同比增长1%&#xff1b;销售额将近17亿&#xff0c;同比增长约5…

谁可以做网站优化排名推广网站制作用到什么技术

在本文中&#xff0c;我将展示如何在Apache Aries Blueprint xml文件中添加一些内联脚本。 我不一定会称其为最佳实践&#xff0c;但我一直认为这种功能可能有用。 可能当我被迫使用xml来模拟命令式编程结构&#xff08;例如使用Apache Ant时&#xff09;时&#xff0c;我开始…

大庆网站制作公司地址大学生网页设计作业成品

MD[Gitlab 安装手册] Gitlab 安装手册 说明: Gitlab最低配置1核2g,建议配置2核4g以上且单独部署,如有多项目CI/CD要求,可以4核8g 1. 安装相关依赖(安装policycoreutils) [rootsjclinux ~]# yum -y install policycoreutils openssh-server openssh-clients postfix 2. 启动s…

做网站每年要交不费用吗成都公司注册地址托管

一.什么是死锁&#xff1f; 死锁是由于两个或以上的线程互相持有对方需要的资源&#xff0c;导致这些线程处于等待状态&#xff0c;无法执行。 二.产生死锁的四个必要条件 1.互斥性&#xff1a;线程对资源的占有是排他性的&#xff0c;一个资源只能被一个线程占有&#xff0c;直…

中国做铁塔的公司网站网站建设企业服务

目录 力扣724. 寻找数组的中心下标 解析代码 力扣724. 寻找数组的中心下标 724. 寻找数组的中心下标 LCR 012. 寻找数组的中心下标 1991. 找到数组的中间位置&#xff08;三道一样的题&#xff0c;一鱼三吃&#xff09; 难度 简单 给你一个整数数组 nums &#xff0c;请…

基于RSSI修正的定位算法分析

分析和实现基于RSSI(接收信号强度指示)修正的定位算法 % 基于RSSI修正的定位算法分析 clear; clc; close all;%% 1. 参数设置 fprintf(设置定位系统参数...\n);% 环境参数 n = 2.5; % 路径损耗指数 (…

接口测试流程+jmeter并发+面试题(总结) - 指南

接口测试流程+jmeter并发+面试题(总结) - 指南2025-09-22 17:49 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

c# 反射动态添加Attribute

//测试类 var type = typeof(TestClass);//给类对象添加、获取特性 TypeDescriptor.AddAttributes(type, indexAttr); //var attr = TypeDescriptor.GetAttributes(type)[typeof(DynamicCacheBufferAtrribute)] as Dyn…

wordpress站内链接跳转优秀企业宣传册样本

这段代码是 _make_causal_mask 函数中处理滑动窗口局部注意力的部分。这里的目的是创建一个额外的掩码,以便在自注意力机制中只考虑每个位置附近的一定数量的位置,而不是所有之前的位置。这通常用于减少计算复杂性和提高长序列处理的效率。 代码分析如下: diagonal = past_k…

网站开发搭建合同范本如何建立免费网站

转载请说明出处~本文教程翻译jni官方文档的部分内容。要查看Jni官方文档&#xff0c;请点击这里先感叹一下时光如水&#xff0c;岁月不留人哇有木有&#xff01;&#xff01;&#xff01;认真想想在XMU的这三年&#xff0c;真的改变了我好多。我还清楚地记得学习C语言写的第一个…

重庆商城网站建设百度收录的网站标题 --

第一轮 说说HaspMap底层原理&#xff1f;再说说它跟HaspTable和ConcurrentHashMap他们之间的相同点和不同点&#xff1f; 讲讲jdk1.7和1.8的区别&#xff1f; 几种内置的线程池 MySQL事务隔离级别以及MVCC机制 Redis缓存雪崩、缓存穿透以及如何解决&#xff1f; 分布式架构…

广东品牌网站建设报价做门户网站 cms

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有3个1&#xff0c;B中全是0&#xff0c;统计迭代次数并排序。 在3*5的空间内分布3个点有19种可能&#xff0c;但不同的分布只有6种 差值就诶够 …

旅游网站建设的目标青岛最大的设计院

1、集合元素处理&#xff08;传统方式&#xff09; 现在有两个ArrayList集合存储队伍当中的多个成员姓名&#xff0c;要求使用传统的for循环&#xff08;或增强for循环&#xff09;依次进行一下若干操作步骤&#xff1a; 第一个队伍只要 名字为 3 个字 的成员姓名&#xff1b;存…