浅析b-树 b+树 以及Mysql的Innodb,Myisam引擎
B-树性质
B-树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。
1根节点至少有两个子节点
2每个节点有M-1个key,并且以升序排列
3位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
其它节点至少有M/2个子节点
下图是一个M=3 阶的B树

这里简单说明下
图中的小黑方块表示对应关键字所代表的文件的存储位置,实际上可以看做是一个地址,比如根节点中17旁边的小黑块表示的就是关键字17所对应的文件在硬盘中的存储地址。
P是指针,
需要注意的是:指针(P),关键字(17),以及关键字所代表的文件地址这三样东西合起来构成了B树的一个节点,这个节点存储在一个磁盘块上
查找过程
下面,看看搜索关键字的29的文件的过程:
从根节点开始,读取根节点信息,根节点有2个关键字:17和35。因为17 < 29 < 35,所以找到指针P2指向的子树,也就是磁盘块3(第1次I/0操作)
读取当前节点信息,当前节点有2个关键字:26和30。26 < 29 < 30,找到指针P2指向的子树,也就是磁盘块8(第2次I/0操作)
读取当前节点信息,当前节点有2个关键字:28和29。比较找到了!(第3次I/0操作)
B+树性质
B+树是对B树的一种变形树,它与B树的差异在于:
非叶子结点的子树指针与关键字个数相同
非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
所有分支节点的关键字都是对应子树中关键字的最大值(或最小值)
树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

查找过程与b树类似,这里就不再描述了。
为什么mysql数据库采用b+树而不是b树?
B树在提高了IO性能的同时并没有解决遍历元素的效率比较低的问题,
而由于b+树的特点,只需要去遍历叶子节点就可以实现整棵树的遍历.
而且在实际开发中,基于范围的查询是非常频繁的,
而B树不支持这样的操作(或者说效率太低)
关于B树和B+树相关应用拓展
B树一般用于数据库索引或者文件系统,这里我们讨论mysql的两种不同 引擎
Myisam Innodb
1 MyISAM

MyISAM中有两种索引,分别是主索引和辅助索引, 他们的数据都是那列的指针
在这里面的主索引使用主键进行创建,
而二级(辅助)索引中键值则是其他索引列。
MyISAM分别会存一个索引文件和数据文件。它的主索引是非聚集索引。
当我们查询的时候我们找到叶子节点中保存的地址,然后通过地址我们找到所对应的信息
Innodb

InnoDB索引和MyISAM最大的区别是它只有一个数据文件,并且在辅助索引中不存储那列的指针,而是存储主键。
在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,
这棵树的叶子节点数据域保存了完整的数据记录。
我们把它的主索引叫做聚集索引。
而它的辅助索引和MyISAM也会有所不同,它的辅助索引都是将主键作为数据域。
(由于每个辅助索引都包含主键索引,因此,为了减小辅助索引所占空间,我们通常希望 InnoDB 表中的主键索引尽量定义得小一些)
当我们查找的时候通过辅助索引要先找到主键,然后通过主索引再找到对于的主键,得到信息。
注意一下两点:
1聚集索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。聚簇索引要比非聚簇索引查询效率高很多。
例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能
2聚集索引这种主+辅索引的好处是,当发生数据行移动或者页分裂时,辅助索引树不需要更新,因为辅助索引树存储的是主索引的主键关键字,而不是数据具体的物理地址。
那实际情况,我们一般选用哪种引擎?
我们一般使用Innodb,从mysql-5.5.5开始的版本 默认都是innodb引擎。他支持事务,支持行锁,并发度高。尽量不要混用引擎。
浅析b-树 b+树 以及Mysql的Innodb,Myisam引擎的更多相关文章
- MySQL:InnoDB存储引擎的B+树索引算法
很早之前,就从学校的图书馆借了MySQL技术内幕,InnoDB存储引擎这本书,但一直草草阅读,做的笔记也有些凌乱,趁着现在大四了,课程稍微少了一点,整理一下笔记,按照专题写一些,加深一下印象,不枉读了 ...
- mysql的innodb数据库引擎详解
http://www.jb51.net/softjc/158474.html 这篇文章主要介绍了mysql的innodb数据库引擎,需要的朋友可以参考下 一.mysql体系结构和存储引擎 1. ...
- mysql之innodb存储引擎
mysql之innodb存储引擎 innodb和myisam区别 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>. ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
- MySql中innodb存储引擎事务日志详解
分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...
- MySQL数据库InnoDB存储引擎
MySQL数据库InnoDB存储引擎Log漫游 http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/
- mysql中InnoDB存储引擎的行锁和表锁
Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...
- 一文带你读懂 Mysql 和 InnoDB存储引擎
作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...
随机推荐
- QAC静态测试配置及使用教程
使用前提:安装成功QAC软件. . 1.打开软件如上 . 2.file->Auto-Create-Project,出现如下所示对话框 1-工程名字 2-将要分析的代码路径 3-代码报告输出路径 ...
- Caused by: javax.persistence.NonUniqueResultException: result returns more than one elements
Caused by: javax.persistence.NonUniqueResultException: result returns more than one elements at org. ...
- leetcode894
class Solution { private Map<Integer, List<TreeNode>> memo; public List<TreeNode> ...
- Swoft 缓存及Redis使用
配置 修改 /config/properties/cache.php 文件 return [ 'redis' => [ 'name' => 'redis', 'uri' => [ ' ...
- Linux网络编程学习(十一) ----- 五种I/O模式(第六章)
1.五种I/O模式是哪几个? 阻塞I/O,非阻塞I/O,I/O多路复用,信号驱动I/O(SIGIO),异步I/O 一般来讲程序进行输入操作有两个步骤,一是等待有数据可读,二是将数据从系统内核中拷贝到程 ...
- task 异步 进程与线程的区别
用Wait方法(会以同步的方式来执行),不用Wait则会以异步的方式来执行 要在主线程中等待后台线程执行完毕,可以使用Wait方法(会以同步的方式来执行).不用Wait则会以异步的方式来执行. Tas ...
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(四) -- 安装crowd 3.1.2
[原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(四) -- 安装crowd 3.1.2 本来已经安装完毕, 并使用Jira集成的OAuth账户管理, ...
- tensorflow 查看模型输入输出saved_model_cli show --dir ./xxxx --all
saved_model_cli show --dir ./xxxxxxxx --all 可以查看模型的输入输出,比如使用tensorflow export_model_inference.py 输出的 ...
- 小A的位运算-(前缀和+位运算)
https://ac.nowcoder.com/acm/contest/549/D 题意:从N个数里面选出N-1个数要让它们或起来的值最大. 解题: 假设n个数分别存在a数组里. 从左到右连续或运算结 ...
- shell 常用案例
此博文有自己写的其它朋友分享的,其中对其它朋友写的有问题的地方我简单做了一些修改,能保证运行. 1.写一个脚本通过ping命令测试192.168.0151到192.168.0.254之间的所有主机是否 ...