B树(B-树)

B树又称平衡多路二叉树

发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。

B+树

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

B+Tree相对于B-Tree有几点不同:

非叶子节点只存储键值信息。

所有叶子节点之间都有一个链指针。

数据记录都存放在叶子节点中。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值因为是估值,为方便计算,这里的K取值为[10]^3。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。

实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2-4层。MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作。

B树和B+树比较

MySQL为什么要用B+树,是因为要减少磁盘IO

1、B+树不同于B(B-)树,B+树的数据只存在于叶子节点,其它节点用于存储索引,而且叶子节点也用指针串联了起来。

2、B(B-)树中非叶子节点也会存储数据。

3、影响MySQL查找性能的主要是磁盘IO次数,基本就是磁头移动到指定磁道的时间。

mysql里b树_MySQL-B树/B+树相关推荐

  1. mysql 联合索 B 树_MySQL 索引与 B+ 树

    MySQL 索引与 B+ 树 B+ 树 MySQL Innodb 存储引擎是使用 B+ 树来组织索引的.在介绍 B+ 树以前,先认识一下什么是 B 树,B 树是平衡二叉树,与一般的二叉查找树不同,平衡 ...

  2. mysql 二叉树表设计_Mysql 索引模型 B+ 树详解

    一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...

  3. mysql为什么用索引_MySql为什么使用B+树做索引

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上.这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个 ...

  4. mysql里guest用户_MySQL用户权限分配

    mysql> grant 权限1,权限2,-权限n on 数据库名称.表名称 to 用户名@用户地址 identified by '连接口令'; 权限1,权限2,-权限n代表select,ins ...

  5. mysql里guest用户_MySQL降权:MySQL以Guests帐户启动设置方法

    MySQL安装到Windows上,默认是以SYSTEM权限运行,如下图: SYSTEM是超级管理员.不是必须,不推荐用此权限运行任何程序. 本文将演示如何在GUEST帐户下运行MySQL. 第一步:建 ...

  6. MySQL里 unique 用法_mysql中unique key中在查询中的使用

    1.建表语句: sql">CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL,`birth_date` date NOT NULL ...

  7. mysql目录树_MySQL B+树目录及索引优化_mysql

    MySQL的索引实现由很多种实现,包括hash索引,B+索引,全文索引等,本文只讨论B+树索引. 为什么使用B+树索引? 1.评价一个索引好坏主要看IO的访问次数,B+树红黑树来说,树高很小(出度很大 ...

  8. mysql为什么用B 树做索引_mysql为什么用b+树做索引

    关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...

  9. mysql为什么不用b树_MySQL用B+树(而不是B树)做索引的原因

    众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. 1.B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结 ...

  10. mysql数据库设计与应用答案智慧树_知到智慧树_MySQL数据库设计与应用_答案完整...

    知到智慧树_MySQL数据库设计与应用_答案完整 更多相关问题 [B11]A.carry onB.linger onC.set inD.log in 数据库的三级模式结构中,模式也称为A.逻辑模式B. ...

最新文章

  1. linux内核异常分析ecp,内核基于嵌入式Linux的PocketIX系统
  2. python访问网页时401_在python上访问带有基本身份验证的网页
  3. Chromium Android编译指南
  4. Eclipse使用Team explorer everywhere进行代码管理
  5. LeetCode 2133. 检查是否每一行每一列都包含全部整数
  6. cnn stride and padding_彻底搞懂CNN中的卷积和反卷积
  7. Delphi MlSkin v3.9 (2019.4.15)发布啦! 它能让你的程序拥有像QQ一样多彩炫丽的外观...
  8. MYSQL获取同时关注了某两个(或者N个)用户的用户
  9. python中randint用法_python中的randint,引入模块
  10. gtx1050ti最稳定的驱动_GTX1050ti显卡驱动下载_NVIDIA GeForce GTX1050ti显卡驱动Win7Win10版下载 - 系统之家...
  11. 信源编码程序设计实验C语言实现,霍夫曼信源编码实验报告
  12. 深度deepin安装腾达U12无线网卡驱动
  13. 传奇服务器文件组成,【教程】传奇服务端(版本)的结构以及重要文件功能的概述-A02...
  14. 剑指Offe面试题:用两个栈实现队列
  15. FlashVml2.0(WEB上的PhotoShop+Flash、VML最强开发工具)[推荐]
  16. 华为ensp 错误代码 :40
  17. python小_Python小课——学习笔记(3)
  18. Koa洋葱圈模型源码浅析(`await next()`为什么能够形成洋葱圈模型?)
  19. 南京大学java机试,2019南京大学计算机本科生开放日机试
  20. css3布局的若干笔记总结

热门文章

  1. PHP的empty isset is_null
  2. centos php配置mysql数据库_CentOS+Nginx+PHP+MySQL详细配置(图解)
  3. auto errored after 报错解决_MySQL5.7 group_by报错问题解决办法,大部分程序员都收藏了...
  4. PHP中error_reporting()详解
  5. java中qq中拉伸的文件,delphi中如何实现QQ中的截图并实现拉伸放大移动的功能
  6. java获取本地外网ip地址
  7. 欧瑞变频器800参数设置_【收藏】变频器密码大全和维修常用方法!
  8. go build 参数_从0开始Go语言,用Golang搭建网站
  9. ajax代码 java,AJAX - java代码库 - 云代码
  10. oracle 月份期差,Oracle Database 日期算术-日期之间的月份或年份之间的差异