浅析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,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...
随机推荐
- MongoDB(3)--Java 操作 MongoDB 的 API
引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...
- tomcat启动成功后访问却404
1.检查是否把项目添加进tomcat,好久不用tomcat这次就犯了这种低级错误 2.检查路径,tomcat中的访问路径与项目中设置的路径是否一样,因为这次有些配置文件直接复制的源码,但源码中项目名称 ...
- 简介C#读取XML的方式(转)
在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询. XML作用 ...
- python_练习04
选课系统 角色:学校.学员.课程.讲师 要求: 1.创建北京.上海2所学校 2.创建linux.python.go3个课程,linux.python在北京开,go在上海开3.课程包含,周期,价格,通过 ...
- 百度获取图片 json格式解析
var h,i: integer; ss, url: string; mem: TMemoryStream; str1: tstringlist; memstr: TStringStream; idd ...
- concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var arr1 = ['a', 'b', 'c']; var arr2 = ['d', 'e', 'f']; var arr3 = arr1.concat(arr2); // arr3 is a n ...
- 2018/12/22:centos中转换目录时/root的影响
今天在将一个压缩包复制到/root下,并解压.从表面看我试在根目录下,但是就是不能进入生成的目录,提示no such file or diraction.最后我加上/root又好了,奇怪 编译环境:输 ...
- 转载(TCPClient 建立连接和断开连接函数)
public bool networkbuild()//建立端口连接 { if (client == null) { try { client = new TcpClient(networkip, n ...
- Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)
题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...
- Collections与Collection
Collection是集合体系的最顶层,包含了集合体系的共性 Collections是一个工具类,方法都是用用Collection Collections方法: //static int binary ...