http://www.cnblogs.com/tgycoder/p/5410057.html
B-树
B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树 它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.
B-树有如下特点:
-
所有键值分布在整颗树中;
-
任何一个关键字出现且只出现在一个结点中;
-
搜索有可能在非叶子结点结束;
-
在关键字全集内做一次查找,性能逼近二分查找;
B+ 树
B+树是B-树的变体,也是一种多路搜索树, 它与 B- 树的不同之处在于:
-
所有关键字存储在叶子节点出现,内部节点(非叶子节点并不存储真正的 data)
-
为所有叶子结点增加了一个链指针
简化 B+树 如下图
为什么使用B-/B+ Tree
红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B-/+Tree作为索引结构。MySQL 是基于磁盘的数据库系统,索引往往以索引文件的形式存储的磁盘上,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。为什么使用B-/+Tree,还跟磁盘存取原理有关。
局部性原理与磁盘预读
由于磁盘的存取速度与内存之间鸿沟,为了提高效率,要尽量减少磁盘I/O.磁盘往往不是严格按需读取,而是每次都会预读,磁盘读取完需要的数据,会顺序向后读一定长度的数据放入内存。而这样做的理论依据是计算机科学中著名的局部性原理:
当一个数据被用到时,其附近的数据也通常会马上被使用
程序运行期间所需要的数据通常比较集中
由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。
MySQL(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16K(这个值可以修改).linux 默认页大小为4K
B-/+Tree索引的性能分析
实际实现B-Tree还需要使用如下技巧:
每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个结点只需一次I/O。
假设 B-Tree 的高度为 h,B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。
而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。
为什么使用 B+树
-
B+树更适合外部存储,由于内节点无 data 域,一个结点可以存储更多的内结点,每个节点能索引的范围更大更精确,也意味着 B+树单次磁盘IO的信息量大于B-树,I/O效率更高。
-
Mysql是一种关系型数据库,区间访问是常见的一种情况,B+树叶节点增加的链指针,加强了区间访问性,可使用在范围区间查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。
我的博客: http://ygmyth.github.io
参考文献
[1] 姜承尧 著;MySQL技术内幕-InnoDB存储引擎;机械工业出版社,2013
[2] MySQL索引背后的数据结构及算法原理 http://blog.codinglabs.org/articles/theo...
[3] 从 MongoDB 及 Mysql 谈B/B+树 http://blog.csdn.net/wwh578867817/articl...
相关推荐
可以解决如下问题: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 操作方法:#rm /usr/lib/x86_64-linux-gnu# rm libstdc++.so.6 #ln libstdc++.so.6.0.20 libstdc++.so.6 ...
spring-boot+mybatis+mysql+maven整合,有教程,可以去我的博客看
springboot+mybatis-plus+gradle+mysql+swagger基础增删改查、树形查询,含SQL脚本
29.基于Web的社区医院管理服务系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) 详细设计文档介绍链接:http://t.csdnimg.cn/NgQjJ 内容概要: 社区医院...
6.大学生兼职信息系统|基于SSM 框架+vue+ Mysql+Java+B/S架构技术(lw+PPT) 本文以Java为开发技术,实现了一个大学生兼职信息系统。大学生兼职信息系统的主要实现功能包括:管理员:首页、个人中心、学生管理、学生...
流行框架:SpringMvc+Spring+mybatis+maven 数据库:mysql web框架:bootstrap,My97DatePickers 定时器任务:job 事务管理:mysql事务处理
具体在系统设计上,采用了B/S的结构,同时,也使用Java技术在动态页面上进行了设计,后台上采用Mysql数据库,是一个非常优秀的大学生兼职跟踪系统。 关键词 :大学生兼职跟踪系统;Java技术;Mysql数据库;B/S结构
最近读了spring-boot开发手册,spring-boot相比于spring-mvc封装了很多常用的依赖,并且内置了tomcat容器,启动生成的jar包即可启动项目,也是目前流行...本文主要用到了spring-boot,以及mybatis,数据库用到了mysql。
具体在系统设计上,采用了B/S的结构,同时,也使用Java技术在动态页面上进行了设计,后台上采用Mysql数据库,是一个非常优秀的大学生兼职信息系统。 关键词 :大学生兼职信息系统;Java技术;Mysql数据库;B/S结构 ...
大学生企业推荐系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和学生、企业三部分,管理员主要功能包括:首页、个人中心、学生管理、企业管理、招聘信息管理、个人简历管理、应聘职位...
spring-boot集成mybatis+druid实现 hive/mysql多数据源切换,用mysql数据库作为用户验证库以及用户信息库,hive作为数据可视化源库。
17.基于vue的MOBA类游戏攻略分享平台的设计与实现|Springboot+Vue+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)游戏大全小游戏推荐游戏攻略公告留言板新闻 详细介绍链接:http://t.csdnimg.cn/FOih9 内容...
+-------------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) · 6、 往表中加入记录 我们先用SELECT命令来查看表中的数据: mysql> select * from mytable; Empty set (0.00 sec...
MySQL - 索引(B+树) 1 # B+ Tree 原理 1 (一)更少的查找次数 2 (二)利用计算机预读特性 2 # MySQL 索引 2 # 索引优化 4 # 索引的优点 5 # 索引的使用场景 6
MySQL-python-1.2.4b4.win32-py2.7.exe numpy-1.8.1-win32-superpack-python2.7.exe pyparsing-2.0.2.win32-py2.7.exe python-dateutil-2.2.win32-py2.7.exe six-1.7.3.win32-py2.7.exe PyScripter-v2.5.3-...
3.留守儿童爱心网站设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档) 内容概要: 采用了B/S结构,JAVA作为开发语言,数据库采用了B/S结构,Mysql数据库进行开发。该系统包括前台操作,后台...
这是JSP+Servlet+MySql新闻管理系统,环境Eclipse+Mysql+Tomacat8.5运行的,里面libJAR包都有,jsp+servlet+jdbc实现新闻管理系统,这个视频值得看,很基础。...
大学生企业推荐系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和学生、企业三部分,管理员主要功能包括:首页、个人中心、学生管理、企业管理、招聘信息管理、个人简历管理、应聘职位...
25.超市管理系统|基于JSP技术+ Mysql+Java+ B/S结构的超市管理系统设计与实现(可运行源码+数据库+设计文档) 以JSP为开发技术,实现了一个超市管理系统。超市管理系统的主要使用者分为管理员;个人中心、员工管理、...
28.电影院售票网站|基于SSM框架+ Mysql+Java+ B/S结构的电影院售票网站设计与实现(可运行源码+数据库+开发文档+lw) 代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机...