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+树的更多相关文章

  1. 为什么MySQL索引使用B+树

    为什么MySQL索引使用B+树 聚簇索引与非聚簇索引 不同的存储引擎,数据文件和索引文件位置是不同的,但是都是在磁盘上而不是内存上,根据索引文件.数据文件是否放在一起而有了分类: 聚簇索引:数据文件和 ...

  2. 聊聊Mysql索引和redis跳表

    摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...

  3. [转] MySQL索引原理

    MySQL索引原理 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉 ...

  4. 浅谈Mysql索引

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...

  5. 聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)

    redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的.B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试) 还有个几个姊妹篇:介绍 ...

  6. 从MongoDB及mysql 谈B/B+树

    一 B树的由来 B树指的是一类树,包括B-树,B+树,B*树等,是一种自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点.B树是专门为外部存储器设计的,如磁盘,它对于读 ...

  7. mysql索引原理深度解析

    mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ...

  8. MySQL索引由浅入深

    索引是SQL优化中最重要的手段之一,本文从基础到原理,带你深度掌握索引. 一.索引基础 1.什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,索引对于 ...

  9. B+树|MYSQL索引使用原则

    MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过 ...

随机推荐

  1. BZOJ2338: [HNOI2011]数矩形

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...

  2. angular $stateProvider 路由的使用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...

  4. phpstudy最新版中php5.6版报错

  5. 织梦DEDE网站后台如何上传附件

    如题,织梦DEDE网站后台如何上传附件?今天本人遇到这样的问题,在网站后台里点击一番后,成功上传了一个pdf文件和doc文件,特来分享经验. 工具/原料 织梦dede网站 doc文件 方法/步骤 1 ...

  6. ajax_表单提交+tp5ajax

    ======================================================= 判断squery导入的是否正确? $(function(){ alert('1'); } ...

  7. 那些年~~~我们的C#笔试内测题目

    <深入.NET平台和C#编程>内部测试题-笔试试卷 一 选择题 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格 ...

  8. Git学习(2)-使用Git 代码将本地文件提交到 GitHub

    上次随笔写到git的安装和运用命令窗口创建本地版本库,这次主要讲一下用git代码将本地文件提交到GitHub上. 前提是有一个GitHub账号. 1.创建一个新的版本库,进入到你本地项目的根目录下(我 ...

  9. Hadoop问题:chmod 0700 of directory /var/lib/apt/lists/

    问题描述: apt-get update W: chmod of directory /: Operation not permitted) E: Could not open : Permissio ...

  10. J.U.C atomic 数组,字段原子操作

    这里看一下原子数组操作和一些其他的原子操作. AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择代表性的AtomicInt ...