通常来讲,索引文件占用空间比较大, 须要存储在磁盘上。索引查找须要经过磁盘I/O操做才能进行,而咱们知道,磁盘I/O比内存读取要高几个数量级,因此如何减小磁盘I/O次数,是索引数据结构选择的首要参考条件。sql
计算机局部性原理认为:当一个数据被用到时,其附近的数据也一般会立刻被使用。所以为了减小磁盘I/O,磁盘每每不是严格按需读取,磁盘会从读取的这个位置开始,顺序向后读取必定长度的数据放入内存。磁盘一次预读会读取页的整数倍大小的数据。数据结构
B-树的设计利用了计算机的局部性原理和预读,每一个节点新建时申请磁盘一页数据的大小,这样节点载入和查找只须要一次磁盘I/O。同时B+树进行了改进,B+树非叶子节点只用来索引,不存放数据,叶子节点存放完整的数据记录,且具备指向相邻叶子节点的指针(方便区间访问) 。这样的设计使得B+树的高度更小,磁盘IO读写次数就下降了,同时因为B+树的全部数据都存放在叶子节点上,扫库的话只须要扫一遍叶子节点便可。app
B+树一个节点的数据大小就是计算机磁盘一页数据的大小,计算机一页数据大小为16k。咱们知道,B+树的非叶子节点存放的是数据索引,假设Innodb里设置的指针大小为6字节,而存储的索引字段为bigint类型,长度为8字节,则对非叶子节点来讲,一个节点能够存储16384/14=1167个索引;对于叶子节点来讲,假设每条记录大小为1k,一个节点能够存储16k/1k=16个数据。那么可知,高度为2的B+树最多能够存放1167*16=18672条数据,高度为3的B+树最多能够存放1167*1167*16=21790224条数据。ui