MySQL索引之B+树
MySQL索引大都存储在B+树中,除此还有R树和hash索引。B+树的基础还是B树。
B树由2部分组成,节点和索引。下面将构建一个B树,每个节点存2个数据,每个节点有前,中,后三个索引。插入数字的顺序为1,2,3,4,5,6。


每个节点存储2个数据,插入3时将进行分裂操作。节点一分为2,并在中间增加一个新的节点。新增节点将1,2,3中间的数字2进行存储。
数字2的前后有2个索引,左边的索引指向的节点中的数字都比2小,右边索引中指向的节点中的数字都比2大。


插入5时,节点1分为2,并将3,4,5中间的数字4上移至上级节点存储。


下面尝试插入顺序为8,5,1,7,3,12,9,6的B树生成顺序。
插入数字8

插入数字5

插入数字1

插入数字7

插入数字3

插入数字12

插入数字9

插入数字6

B+树是在B树的基础上建立的,B+树数据将只会存储在叶子节点上,非叶子节点将只存在索引。由于B+树的非叶子节点只存储索引,则同样大小的内存B+树存放的索引节点较多,树的高度也会较小,查取方便。
下面尝试插入顺序为8,5,1,7,3,12,9,6的B+树生成顺序。可以将这些数字对应于MySQL数据库表中的主键,数字后面所存储的才是具体的数据。
插入数字8

插入数字5

插入数字1,注意节点5只是索引上移了,具体的存储还是在叶子节点中,这就不同于B树了。

插入数字7

插入数字3

插入数字12.要新增索引节点8(7<8<12),还会导致索引节点5的上移(3<5<8)。

插入数字9

插入数字6.最上层的索引节点是5,6大于5,只能位于索引5的右侧,就不能和叶子节点中的5放在一起,会导致索引7上移。

MySQL中索引和数据是分成不同的文件存储的,对应于B+树,我们可以理解为非叶子节点是存储在一个文件中的,叶子节点是存储在一个文件中的。
查看MySQL安装目录下的data目录,下面可以查看到已经创建的数据表的存储文件。
MyISAM类型的表有以下的文件:
.MYD:数据文件
.MYI:索引文件
.frm:表描述文件
InnoDB类型的表有以下的文件:
.frm:表描述文件
.idb:单独一个表的数据内容以及索引内容
InnoDB的存储又分为共享表空间和独立表空间。
在my.ini中设置:innodb_file_per_table=1 为使用独占表空间
innodb_file_per_table=0 为使用共享表空间。
共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1 初始化为10M。
独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
共享表空间数据和文件放在一起方便管理,独占表空间将拥有更高的效率。
InnoDB日志文件(ib_logfile1和ib_logfile2),用户崩溃恢复和备份。
在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据.因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相同,就能够打开表,读取到数据.
可参见:http://blog.csdn.net/ylqmf/article/details/7229562
MySQL索引之B+树的更多相关文章
- 为什么MySQL索引使用B+树
为什么MySQL索引使用B+树 聚簇索引与非聚簇索引 不同的存储引擎,数据文件和索引文件位置是不同的,但是都是在磁盘上而不是内存上,根据索引文件.数据文件是否放在一起而有了分类: 聚簇索引:数据文件和 ...
- 聊聊Mysql索引和redis跳表
摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...
- [转] MySQL索引原理
MySQL索引原理 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉 ...
- 浅谈Mysql索引
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...
- 聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)
redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的.B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试) 还有个几个姊妹篇:介绍 ...
- 从MongoDB及mysql 谈B/B+树
一 B树的由来 B树指的是一类树,包括B-树,B+树,B*树等,是一种自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点.B树是专门为外部存储器设计的,如磁盘,它对于读 ...
- mysql索引原理深度解析
mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ...
- MySQL索引由浅入深
索引是SQL优化中最重要的手段之一,本文从基础到原理,带你深度掌握索引. 一.索引基础 1.什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,索引对于 ...
- B+树|MYSQL索引使用原则
MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过 ...
随机推荐
- [51nod1291]Farmer
用单调栈的话不严格的O(n^3)可以轻松艹过去,统计的时候要差分. 可以发现,对于一个单调栈里的元素,从它进栈到出栈都会重复类似的计算..再差分一波后就可以只在出栈的时候计算一下了. 具体的话看代码吧 ...
- BC#65T4 ZYB's Tree
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5593 点分治被卡了TAT... 正解是dp,可以按层数考虑dp,先预处理跑一边dfs得到子树各层数点数大小 ...
- C/C++之循环结构
C语言中提供四种循环,即goto循环.while循环.do…while循环和for循环.四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经 ...
- [国嵌攻略][108][Linux内核链表]
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...
- HDU 1874 畅通工程续(模板题——Floyd算法)
题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰 ...
- Flask连接数据库打怪升级之旅
一.前言 在初学 Flask 的时候,在数据库连接这部分也跟每个初学者一样.但是随着工作中项目接手的多了,代码写的多了,历练的多了也就有了自己的经验和技巧.在对这块儿代码不断的进行升级改造后,整理了在 ...
- Spark算子--SortBy
转载请标明出处http://www.cnblogs.com/haozhengfei/p/39edcbb10b5076599c0e5609b7136b88.html SortBy--Transforma ...
- sql语句添加删除外键及其约束
--删除外键 ALTER TABLE t_base_role_module DROP CONSTRAINT fk_t_base_role_module_t_base_defined_url; --增加 ...
- Mac下Charles Contents乱码解决办法
用到Charles,下载最新的4.0.1版本,但是发生乱码问题.百度好久才找到个靠谱的,那些说什么在Info.plist文件加字符串的,都是假的,反正我是试了都没用,这里记下详细的操作步骤解决: 1. ...
- Redis 2种持久化模式的缺陷
http://blog.csdn.net/hexieshangwang/article/details/47254087 一.RDB持久化模式缺陷 1.问题描述: 并发200路,模拟不断写Redis, ...