mysql采⽤B+树的⽅式存储索引信息
b+树结构如下:
说⼀下b+树的⼏个特点:
1. 叶⼦节点(最下⾯的⼀层)存储关键字(索引字段的值)信息及对应的data,叶
⼦节点存储了所有记录的关键字信息
2. 其他⾮叶⼦节点只存储关键字的信息及⼦节点的指针
3. 每个叶⼦节点相当于mysql中的⼀页,同层级的叶⼦节点以双向链表的形式相连
4. 每个节点(页)中存储了多条记录,记录之间⽤单链表的形式连接组成了⼀条有
序的链表,顺序是按照索引字段排序的
5. b+树中检索数据时:每次检索都是从根节点开始,⼀直需要搜索到叶⼦节点
InnoDB 的数据是按数据页为单位来读写的。也就是说,当需要读取⼀条记录的时候,并
不是将这个记录本⾝从磁盘读取出来,⽽是以页为单位,将整个也加载到内存中,⼀个页
中可能有很多记录,然后在内存中对页进⾏检索。在innodb中,每个页的⼤⼩默认是
16kb。
为什么说B+树比B树更适合数据库索引?
1、B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。