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相同,就能够打开表,读取到数据.

更多相关文章

  1. SQL按数字排序并保持分组
  2. 如何在SQL查询中显示特定范围的数字
  3. 尝试使用PHP和MySQL获取节点的路径
  4. 在for循环中生成的数字如何输出它们,就像它们的最高值是1和最低0
  5. 如何从一个节点生成exe文件。js应用?
  6. 前端笔记之JavaScript(十)深入JavaScript节点&DOM&事件
  7. js金额数字格式化实现代码(三位加逗号处理保留两位置小数)
  8. javascript如何取字符串中的数字
  9. 密码强度正则表达式与数字[重复]

随机推荐

  1. ASP.NET GridView 绑定 MySql数据库
  2. MYSQL学习笔记2之MySQL 管理
  3. vmware12下的centos7 linux 安装 mysql5.
  4. MySQL开启远程链接(2014.12.12)
  5. 如何使用mysql在php文件夹中快速更改图像
  6. 为什么这个查询需要很长时间才能执行
  7. mysql进阶(十一)外键在数据库中的作用
  8. 如何启用对MySQL服务器的外部访问?
  9. php 连接数据库 Warning: mysqli_connect
  10. XAMPP附带的mysql如何修改密码