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

 

转载于:https://www.cnblogs.com/lnlvinso/p/4092115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值