mysql索引为什么是b+树(mysql 使用B+树索引有哪些优势)
mysql索引为什么是b+树
mysql 使用B+树索引有哪些优势搞懂这个问题之前,我们首先来看一下mysql表的存储结构,再分别对比二叉树、多叉树、b树和b+树的区别就都懂了。
mysql的存储结构
表存储结构
单位:表>段>区>页>行
在数据库中, 不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说存储空间的基本单位是页。
一个页就是一棵树b+树的节点,数据库i/o操作的最小单位是页,与数据库相关的内容都会存储在页的结构里。
b+树索引结构
- 在一棵b+树中,每个节点为都是一个页,每次新建节点的时候,就会申请一个页空间
- 同一层的节点为之间,通过页的结构构成了一个双向链表
- 非叶子节点为,包括了多个索引行,每个索引行里存储索引键和指向下一层页面的指针
- 叶子节点为,存储了关键字和行记录,在节点内部(也就是页结构的内部)记录之间是一个单向的链表
b+树页节点结构
有以下几个特点
- 将所有的记录分成几个组, 每组会存储多条记录,
- 页目录存储的是槽(slot),槽相当于分组记录的索引,每个槽指针指向了不同组的最后一个记录
- 我们通过槽定位到组,再查看组中的记录
页的主要作用是存储记录,在页中记录以单链表的形式进行存储。
单链表优点是插入、删除方便,缺点是检索效率不高,最坏的情况要遍历链表所有的节点。因此页目录中提供了二分查找的方式,来提高记录的检索效率。
b+树的检索过程
我们再来看下b+树的检索过程
- 从b+树的根开始,逐层找到叶子节点。
- 找到叶子节点为对应的数据页,将数据叶加载到内存中,通过页目录的槽采用二分查找的方式先找到一个粗略的记录分组。
- 在分组中通过链表遍历的方式进行记录的查找。
为什么要用b+树索引
数据库访问数据要通过页,一个页就是一个b+树节点,访问一个节点相当于一次i/o操作,所以越快能找到节点,查找性能越好。
b+树的特点就是够矮够胖,能有效地减少访问节点次数从而提高性能。
下面,我们来对比一个二叉树、多叉树、b树和b+树。
二叉树
二叉树是一种二分查找树,有很好的查找性能,相当于二分查找。
但是当n比较大的时候,树的深度比较高。数据查询的时间主要依赖于磁盘io的次数,二叉树深度越大,查找的次数越多,性能越差。
最坏的情况是退化成了链表,如下图
为了让二叉树不至于退化成链表,人们发明了avl树(平衡二叉搜索树):任何结点的左子树和右子树高度最多相差1
多叉树
多叉树就是节点可以是m个,能有效地减少高度,高度变小后,节点变少i/o自然少,性能比二叉树好了
b树
b树简单地说就是多叉树,每个叶子会存储数据,和指向下一个节点的指针。
例如要查找9,步骤如下
- 我们与根节点的关键字 (17,35)进行比较,9 小于 17 那么得到指针 p1;
- 按照指针 p1 找到磁盘块 2,关键字为(8,12),因为 9 在 8 和 12 之间,所以我们得到指针 p2;
- 按照指针 p2 找到磁盘块 6,关键字为(9,10),然后我们找到了关键字 9。
b+树
b+树是b树的改进,简单地说是:只有叶子节点才存数据,非叶子节点是存储的指针;所有叶子节点构成一个有序链表
b+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对b树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对io读写次数就降低了
例如要查找关键字16,步骤如下
- 与根节点的关键字 (1,18,35) 进行比较,16 在 1 和 18 之间,得到指针 p1(指向磁盘块 2)
- 找到磁盘块 2,关键字为(1,8,14),因为 16 大于 14,所以得到指针 p3(指向磁盘块 7)
- 找到磁盘块 7,关键字为(14,16,17),然后我们找到了关键字 16,所以可以找到关键字 16 所对应的数据。
b+树与b树的不同:
- b+树非叶子节点不存在数据只存索引,b树非叶子节点存储数据
- b+树查询效率更高。b+树使用双向链表串连所有叶子节点,区间查询效率更高(因为所有数据都在b+树的叶子节点,扫描数据库 只需扫一遍叶子结点就行了),但是b树则需要通过中序遍历才能完成查询范围的查找。
- b+树查询效率更稳定。b+树每次都必须查询到叶子节点才能找到数据,而b树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定
- b+树的磁盘读写代价更小。b+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对b树更小,通常b+树矮更胖,高度小查询产生的i/o更少。
这就是mysql使用b+树的原因,就是这么简单!
以上就是mysql 使用b+树索引有哪些优势的详细内容,更多关于mysql 使用b+树索引的资料请关注开心学习网其它相关文章!
原文链接:https://www.cnblogs.com/chenqionghe/p/14295404.html
- 如何查看mysql执行计划(到底什么是Mysql执行计划?)
- mysql主从复制原理详解(详解MySQL kill 指令的执行原理)
- mysql的innodb引擎数据结构(MySQL InnoDB架构的相关总结)
- mysql删除表内所有数据(mysql 大表批量删除大量数据的实现方法)
- deepin数据库编程(deepin20.1系统安装MySQL8.0.23超详细的MySQL8安装教程)
- mysql 命令与sqlserver的区别大么(MySQL系列之执行SQL 语句时发生了什么?)
- mysql设置updatetime自动更新(mysql 实现添加时间自动添加更新时间自动更新操作)
- mysql查看执行计划
- mysql的limit的分页使用(获取 MySQL innodb B+tree 的高度的方法)
- mysqldata数据如何恢复(mysql5.7.33误删除ibdata文件找回数据的方法)
- mysqltext与varchar区别(MySQL CHAR和VARCHAR该如何选择)
- mysql触发器入门(MySQL中触发器和游标的介绍与使用)
- mysql中数据类型的学习体会(MySQL 实现lastInfdexOf的功能案例)
- mac更改mysql密码(Mac下mysql 8.0.22 找回密码的方法)
- mysql的常见优化(详解GaussDB for MySQL性能优化)
- mysql数据库三种模式(MySQL数据库是如何实现XA规范的)
- 读卖乐园的彩灯(读卖乐园的彩灯)
- 新疆80后在淘宝卖干果 以前是 不务正业 如今帮乡亲致富(新疆80后在淘宝卖干果)
- 弄清楚了销 售 买 卖这四个字,母婴生意做起来就没那么难了(弄清楚了销售买)
- 数读 买首饰金是 投资黄金 吗 买金容易卖金难(数读买首饰金是)
- 销 售 买 卖 你真的了解这四个字了吗(销售买)
- 谢娜是得罪快乐大本营造型师了吗 全场被黑化(谢娜是得罪快乐大本营造型师了吗)
热门推荐
- vue商城购物车数据(vue实现购物车全部功能的简单方法)
- js时间变成日期格式(js日期时间格式化的方法实例)
- docker安装镜像失败(阿里云镜像安装docker报错的问题及解决方案)
- tomcat docker 性能(Docker Nginx容器和Tomcat容器实现负载均衡与动静分离操作)
- vue怎么实现输入框(vue车牌输入组件使用方法详解)
- 用docker搭建在线开发环境(Docker环境搭建的简单方法)
- mysql六大锁解析(MySQL 锁的相关知识总结)
- extjs checkboxGroup 复选框的用法
- mysql查看数据库cpu使用率(CPU 以及内存从哪些方面影响 MySQL 性能?)
- mysql创建数据库基本指令(MySql 新建用户与数据库的实际操作步骤)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9