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引擎的更多相关文章

  1. MySQL:InnoDB存储引擎的B+树索引算法

    很早之前,就从学校的图书馆借了MySQL技术内幕,InnoDB存储引擎这本书,但一直草草阅读,做的笔记也有些凌乱,趁着现在大四了,课程稍微少了一点,整理一下笔记,按照专题写一些,加深一下印象,不枉读了 ...

  2. mysql的innodb数据库引擎详解

    http://www.jb51.net/softjc/158474.html   这篇文章主要介绍了mysql的innodb数据库引擎,需要的朋友可以参考下   一.mysql体系结构和存储引擎 1. ...

  3. mysql之innodb存储引擎

    mysql之innodb存储引擎 innodb和myisam区别 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>. ...

  4. MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

    文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...

  5. MySQL数据库InnoDB存储引擎中的锁机制

    MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...

  6. MySql中innodb存储引擎事务日志详解

    分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...

  7. MySQL数据库InnoDB存储引擎

    MySQL数据库InnoDB存储引擎Log漫游  http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/

  8. mysql中InnoDB存储引擎的行锁和表锁

    Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...

  9. 一文带你读懂 Mysql 和 InnoDB存储引擎

    作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...

随机推荐

  1. Java就业班 mysql02

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  2. 获取object的值

    class Program { static void Main(string[] args) { var data = Unite(); var name = data.GetType().GetP ...

  3. oracle数据库误删的表以及表中记录的恢复

    oracle数据库误删的表以及表中记录的恢复 一.表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: --1.从flash bac ...

  4. Mybatis级联:关联、集合和鉴别器的使用

    Mybatis中级联有关联(association).集合(collection).鉴别器(discriminator)三种.其中,association对应一对一关系.collection对应一对多 ...

  5. [转载]EF或LINQ 查询时使用IN并且根据列表自定义排序方法

    原文地址:EF或LINQ 查询时使用IN并且根据列表自定义排序方法作者:李明川 EF和LINQ改变了原有的手写SQL时期的一些编码方法,并且增强了各数据库之间的移植性简化了开发时的代码量和难度,由于很 ...

  6. pytorch之张量的理解

    张量==容器 张量是现代机器学习的基础,他的核心是一个容器,多数情况下,它包含数字,因此可以将它看成一个数字的水桶. 张量有很多中形式,首先让我们来看最基本的形式.从0维到5维的形式 0维张量/标量: ...

  7. UTF-8和GBK有什么区别

    UTF-8和GBK有什么区别 2017年06月03日 18:10:43 阅读数:6516 GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准).GBK编码专门用来解决 ...

  8. 《Http权威指南》读书笔记

    第7章 Http缓存 1.什么是Http缓存? http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有"要请求资源"的副本,就可以直接从浏览器缓存中提取 ...

  9. vue(一)vue-cli安装

    第一步:我们首先要全局安装vue官方提供的脚手架工具:vue-cli $ npm install vue-cli -g 第二步:然后我们就可以创建自己的vue项目了, $ vue init webpa ...

  10. Linux-Centon7安装以及配置

    环境:MacOS 10.13.6 虚拟机:VirtualBox6.0(VirtualBox-6.0.4-128413-OSX.dmg) Linux:Centos7(CentOS-7-x86_64-Mi ...