MySQL中的数据存储在磁盘而不是内存的原因
内存容量小,而且发生意外时(比如断电或者发生故障重启)会导致数据丢失。
InnoDB采用B+树作为索引的数据结构的原因
- 速度:内存寻址>>顺序I/O>随机I/O (使查询速度快,则要减少磁盘I/O次数)。
- 查询类型:等值查询,范围查询(支持等值查询和范围查询)。
其他数据结构
数组:更新操作需要移动元素,效率低。
链表:虽然它更新的效率比较高,但是查询的时候需要全表查询。
哈希:只支持等值查询,不支持范围查询。
二叉搜索树
节点的左子树小于该节点,节点的右子树大于该节点的二叉树。
存在一个特殊的情况,可能会演变成一个链表。前面也提到了,链表的查询效率是非常低的,不太符合要求。
平衡二叉树
在二叉搜索树的基础上,节点的左子树和节点的右子树的高度差不能超过1。
平衡二叉树支持等值查询,也支持范围查询。但是平衡二叉树一个节点只存储一行的数据,当数据量比较大的时候,它的高度就会越来越大,那么磁盘I/O也就会越来越大。
所以他是不符合咱们的要求的。
B树
平衡的多路搜索树。M阶表示一个节点最多包括M个子节点,平衡二叉树就是二阶B树。
图中最大的子节点数量是3,所以该B树是一个三阶B树。
B+树
B+树:是B树的变种,既非叶子节点只存储索引,叶子节点存储索引和数据。
相比B树的优势
- B+树在分叶节点上只是存储索引,而B树是既要存储索引又要存储数据。那么他的存储行数一定比B树少。因此B+树可以存储更多的内容。
- B树有回旋,假设要查询大于等于1的数,首先咱们定位到叶子,找到1。然后再回去找页3,然后找页12。页12又回去找页3,有一个回旋出现。B+树则没有这个情况的出现。B+树在叶子节点上遍历链表就能查询相关数据。
参考资料:InnoDB索引的数据结构