1.前言
通过前面的一小节打开可以简单了解了Mysql索引到底是什么,有什么用已经创建它的各种语法,甚至还有关于我们DBA和一些开发人员在创建索引时要注意的一些基本事项等等,今天这一小节将会具体介绍一下Mysql索引的数据结构
2.Mysql索引之B+树
似乎所有的DBA运维开发人员都应该知道Mysql的索引底层用的是B+树的数据结构,B+树又称为N叉树,它相对数据结构中的平衡二叉树而言,当存储大量的数据时,B+树的数据结构会显得"更矮更胖"一下,这就意味这它的树高度往往要比平衡二叉树的树高度要低一些。
2.1这里简单介绍一下B+树结构组成的索引组织表如下:
- 这里 B+树的高度是2,Records per page 4 , Fanout 5. Fanout指的是B+树的扇出,它可以看做是一个子节点指针(位置信息),其次Records per page 4 在这里通常指的是一个数据页上能存放的记录(最大)。
- 如上图所示,该树的高度为2,最上的一层通常称为根节点,最下的一层通常称为叶子节点,中间的节点一般称为非叶子节点,其中根节点和非叶子节点存储的是key,就是索引键,该值一般是被设置为索引的字段,而非叶子节点一般存储的是key-value形式,其中key就是索引字段,value指的是该字段对应的这一行记录(record)。
- 非叶子节点中数据页与数据页之间是通过双向链表这样的结构进行连接,其优势是可以进行数据的范围(range)查找。
- 之后会拿出一小节来单独聊聊为什么Mysql钟爱B+树?而不是B树、红黑树等等
3.B+树到底有多大容量?
3.1以下是一个三层高度的B+树
请问三层的B+数据结构可以存储多少条记录?
1.首先有几个这样的概念,第一:一个数据页(page)大小是16k, 第二:每个数据页上有一个指针长度,通常在6bit大小
2.这里假设一张表上的索引类型是bigint,那么它占用8个字节的长度,对于一个非叶子节点来说,它可以存储的索引字段的记录为:(16*1024)/(8+6)=1170,这里约等于,就意味着有1170个扇出,那么对于高度为2的B+树,假设叶子节点中存储的记录大小为1KB,那么,每个数据页能存储记录数为16K/1K=16, 也就是16条数据,那么对于高度为2的B+树可以存储的数据总量为:1170*16=18720条记录(数据)
3.如果是3层高度的b+树呢?总记录数为1170*1170*16=2190w条记录(数据)
因此:对于B+树而言,三层高度的B+树就存储的数据总量就在千万级别上了。在相同高度的b树存储中是远远达不到这些的。