MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据

文章目录

  • 索引和数据储存
  • Innodb中的索引---B+树
  • B+树与数据页

索引和数据储存

数据在数据库中以的形式存储,每个表中的数据可能有千万条,这些数据在底层存储的时候,是数据页为基本单位进行存储

索引和数据页的关系,可以类比成图书馆里每个书架和书架的分类牌之间的关系,索引就是一个个的牌子,贴在书架上,写着“小说”“文学”“”“影视”等等,而数据页就是一个个的书架,里面的书就是具体的数据…

在数据页中,每条记录之间通过单链表的形式进行连接,而数据页之间通过双向链表的形式进行连接,如下图:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第1张图片

Innodb中的索引—B+树

Innodb中的索引是以B+树的形式来存储数据的。

下面简单模拟一下存储过程:

先创建一张表,表里有c1,c2,c3三个字段:

mysql> use db2;
Database changed
mysql> create table index_demo(
    -> c1 int ,
    -> c2 int,
    -> c3 char(1),
    -> primary key(c1)
    -> ) row_format=compact;
Query OK, 0 rows affected (0.04 sec)

我们创建的这个表,在储存时,是用Compat行格式进行储存的,行格式的内容我们后面介绍,该格式的简化图如下,刚刚创建的这张表是按照下图的格式进行储存:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第2张图片

  • record_type:表示记录的类型
  • next_record:指向下一条记录
  • 各个列的值:即表中字段对应的值

几个记录放在一起就组成了一个数据页:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第3张图片

当我们像数据页中插入更多的 数据时,如果超出容量,会创建一个新的分页:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第4张图片
连续插入多条数据后,可能变成这样的效果:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第5张图片
当有多个数据页后,由于在物理上不连续,为了快速找到该物理页所在,需要创建一个目录页,来记录这个数据页的地址和主键范围:

MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第6张图片
当有多个目录页后,同样需要更高级的目录页来记录地址和其他信息:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第7张图片
这样迭代下去后,就会形成一个树,就对应了数据结构B+树。

B+树与数据页

上面的页面记录如果不断地迭代,可以抽象出下面这个图:
MySQL~InnoDB中索引的底层数据结构--B+树如何存放数据_第8张图片
这个数据结构就是B+树
不论是存放用户记录的数据页,还是存放目录项记录的数据页,最终都可以放到这个数据结构中。

这些数据也就统一被称为节点

从这个图中我们知道,数据库中真实的数据记录全部被放到了B+树的最底层的节点上,这些节点即树的叶子节点剩下的非叶子节点用来存放目录项,直到最上面的节点,树的根节点

一个B+树的节点其实可以分成好多层,规定最下边的,存放真实记录的层为第0层,之后往上是第1层,第2层,…。

我们上面的假设是每也页面放3个数据,然后记录页放4个数据,其实在真实的环境中,一个页面的记录存放量非常巨大,假设一个叶子节点可以存放100条记录,那么存放目录项的节点可以放1000条记录,那么:

  • B+树只有1层,最多100条记录
  • B+树有2层,最多放100×100=10000条记录
  • B+树有3层,最多放100×100×100=1000000条记录
  • B+树有4层,最多放100×100×100×100=100000000条记录

    由此可见B+树的存储能力非常强大,所以一般情况下,我们用到的B+树都不会超过4层…

树的层次越低,IO的次数就越少,每次从磁盘进行一次读取时,会加载一个树的层中某个节点

像上面这样当我们通过主键去查找数据时,最多会进行4次磁盘IO操作(3个目录项页和1个用户记录页),在每个页中又可以进行二分查找,所以可以在非常多的记录中快速的查找到我们想要的数据,这大大提高了查询的效率。

你可能感兴趣的:(MySQL,mysql,数据结构,b树,java,数据库)