您的位置:首页 > 数据库 > MySQL

MySQL索引之B+树

2014-11-12 14:03 537 查看
  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相同,就能够打开表,读取到数据.

可参见:/article/2857997.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: