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了.为什么要改成这样,之前都没有听过 ...
随机推荐
- [bzoj1999]树网的核
从下午坑到网上..noip的数据太弱,若干的地方写挂结果还随便过= = 最坑的就是网上有些题解没考虑周全... 第一步是找直径,用两次bfs(或者dfs,Linux下系统栈挺大的..)解决.找出其中一 ...
- HDU5135 dfs搜索 枚举种数
Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 ...
- linux基本命令学习01
=============================================================================Unix/Linux最主要的应用领域是基础服务 ...
- 试用最强Spark IDE--IDEA
1.安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示 ...
- 【centos6.5 hadoop2.7 _64位一键安装脚本】有问题加我Q直接问
#!/bin/bash#@author:feiyuanxing [既然笨到家,就要努力到家]#@date:2017-01-05#@E-Mail:feiyuanxing@gmail.com#@TARGE ...
- Spark性能调优之Shuffle调优
Spark性能调优之Shuffle调优 • Spark底层shuffle的传输方式是使用netty传输,netty在进行网络传输的过程会申请堆外内存(netty是零拷贝),所以使用了堆外内存. ...
- 如何给网站添加CNZZ站长统计功能代码的常用办法
前几天有个客户来问小编怎么给网站添加上CNZZ站长统计工具,其实这个很简单,只要把cnzz免费代码复制到我们的footer文件就行.今天小编正好有空就来分享一下具体的操作过程. 首先要想获得这个免费的 ...
- __new__、__init__、__call__三个特殊方法
用双下划线包围的特殊方法在Python中又被成为魔术方法,类似于C++等语言中的构造函数,这里我们就来详解Python中的__new__.__init__.__call__三个特殊方法: 1.__ne ...
- VMware虚拟机上建立HTTP服务步骤
1.使用xshell连接虚拟机,也可直接在虚拟机中敲命令. 以下是xshell上的命令: 首先安装HTTPD包 [root@one ~]# mount /dev/sr0 /mnt[root@one ~ ...
- php foreach用法和实例
原文地址:http://www.cnblogs.com/DaBing0806/p/4717718.html foreach()有两种用法:1: foreach(array_name as $value ...