mysql 索引的数据结构为什么要采用B+树


Posted in MySQL onApril 26, 2022

前提: 以下的一些数据结构大家需提前知道,否则看起来会比较有困难,大家也可以按照本文所提到的知识点去主动查阅学习。

1. Hash表?No

因考虑到在数据检索的过程中经常会有范围的查询(如下),而hash表不能提供这种功能。

SELECT * FROM hero WHERE age>5 AND age<20;

使用哈希算法实现的索引虽然可以做到快速检索数据,但是没办法做数据高效范围查找,因此哈希索引是不适合作为 Mysql 的底层索引的数据结构。

2. 二叉查找树(BST)?No

二叉查找树(Binary Search Tree)虽然可以达到范围搜索,但是在树的插入过程中,如果插入的数据本来就是有顺序的,那么就会形成一条链(如下),它的最坏情况是O(n)。 

mysql 索引的数据结构为什么要采用B+树

3. 红黑树?No

红黑树虽然看似达到了平衡状态,但是也会有极端情况存在,和上述BST树一样,虽然不会成为链状,但是红黑树会存在右倾的现象。 

mysql 索引的数据结构为什么要采用B+树

在数据库中的基本主键自增操作,主键一般都是数百万数千万的,如果红黑树存在这种问题,对于查找性能而言也是巨大的消耗,我们数据库不可能忍受这种无意义的等待的。

4. 平衡二叉树(AVL)?差那么二点意思

平衡二叉树,英文翻译为Balanced Binary Tree,为啥叫AVL呢? AVL 是大学教授G.M. Adelson-VelskyE.M. Landis 名称的缩写,他们提出的平衡二叉树的概念,为了纪念他们,将平衡二叉树称为 AVL树。

AVL树本质上是一颗二叉查找树,但是它又具有以下特点:

  • 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,
  • 左右两个子树也都是一棵平衡二叉树。

它不存在红黑树这种右倾的现象,也具备数据高效范围查找的能力,但是数据库查询数据的瓶颈在于磁盘的IO,树节点在磁盘空间中存储可能是不连续的,假设我们一次IO读取一个树的节点,此次读入内存的这页中没有其他树的节点,那么每读取一个树的节点,就要进行一次IO,这是多么消耗时间啊,所以我们设计数据库索引时需要首先考虑怎么尽可能减少磁盘 IO 的次数。 磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘IO的时间;这个花费的时间成本是内存访问的十几万倍左右。 正是由于磁盘IO是非常昂贵的操作,所以计算机操作系统对此做了优化:预读;每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中。因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。

相关术语解释:

扇区(sector):

  • 磁盘上的每个磁道被等分成多个弧段,这个弧段便称作扇区(sector)。
  • 扇区是磁盘物理层面的名称,它是实际发生读写的最底层。

磁盘块(IO Block):

  • 操作系统不与扇区直接进行交互,因为一般情况下一个扇区是512byte,如果1T去用512byte进行划分,那划分的地址空间太多了,为了让操作系统能够寻址到更大的地址空间,操作系统将相邻的扇区组合在一起,形成一个块,对块进行管理。每个磁盘块可以包括 2、4、8、16、32 或 64 个扇区,这便是磁盘块(IO Block)。
  • 磁盘块是操作系统中出现的名称,文件系统读写数据的最小单位,它同时也被叫做磁盘簇。

页(page):

  • 页是内存中出现的名称,它是内存的最小存储单位,页的大小通常为磁盘块大小的 2^n 倍。

5. B-tree(B-树也称B树)?差那么一点意思

B树是一种平衡的多叉树,B树相比于平衡二叉树(AVL),它能够在单个节点中存储大量键,也降低了树的高度,从而减少了IO的次数。 

mysql 索引的数据结构为什么要采用B+树

B树的节点中存储的是数据,单个节点存储的内容还是太少了,如何让一个节点存储的内容更多呢?B+树它来了。

6. B+树

在节点中存储某段数据的首地址,并且B+树的叶子节点用了一个链表串联起来,便于范围查找。 

mysql 索引的数据结构为什么要采用B+树

B+树高度降低,减少了磁盘 IO。其次,B+树的叶子节点是真正数据存储的地方,叶子节点用了链表连接起来,这个链表本身就是有序的,在数据范围查找时,更具备效率。因此 Mysql 的索引用的就是 B+树,B+树在查找效率、范围查找中都有着非常不错的性能。

到此这篇关于一文了解mysql索引的数据结构为什么用B+树的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
如何用Navicat操作MySQL
May 12 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
MySQL 全文索引使用指南
May 25 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
mysql 排序失效
May 20 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 MySQL
关于MySQL中explain工具的使用
May 08 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
pt-archiver 主键自增
Apr 26 #MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 #MySQL
MySQL 数据库范式化设计理论
Apr 22 #MySQL
MySQL提取JSON字段数据实现查询
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 #MySQL
在MySQL中你成功的避开了所有索引
Apr 20 #MySQL
You might like
php巧获服务器端信息
2006/12/06 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php adodb连接不同数据库
2009/03/19 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python爬取三国演义的实现方法
2016/09/12 Python
Python 查看文件的读写权限方法
2018/01/23 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
华为慧通面试题
2012/09/11 面试题
销售代表求职自荐信
2013/10/01 职场文书
公司员工的自我评价范例
2013/11/01 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技