MySql中索引的一些知识
概述
数据库的索引常见的有B树索引、B+树索引、哈希索引,接下来我们队B树索引和B+树索引做一些分析
B树索引
BTree结构
BTree又叫做多路平衡搜索树,一棵M叉BTree特性如下:
- 树中每个节点最多包含m个孩子
- 除根节点与叶子结点外,每个节点至少有[ceil(m/2)]个孩子
- 若根节点不是叶子结点,则至少你有两个孩子
- 所有的叶子结点都在同一层
- 每个非叶子节点由n个key和n+1个指针组成,其中[ceil(m/2)-1]<=n<=m-1
以5叉BTree为例,key的数量:公式推导[ceil(m/2)-1]<=n<=m-1,所以2<=n<=4,当n>4时,中间节点向上分裂到父节点,两边节点也分裂成两个节点。
BTree优缺点
BTree相比于同样节点数量的平衡二叉树,树的高度会小很多,因此I/O操作也会减少,查询效率提高。但是 B 树的每个节点都包含数据(索引+记录),而用户的记录数据的大小很有可能远远超过了索引数据,这就需要花费更多的磁盘 I/O 操作次数来读到「有用的索引数据」。并且BTree不适合做范围查询。
B+Tree结构
B+Tree索引是BTree索引的变种,B+Tree与BTree的区别为:
- n叉B+Tree最多包含n个key,而BTree最多包含n-1个key
- B+Tree的叶子结点保存所有的key信息,依据key大小顺序排列
- 所有的非叶子节点都可以看做是key的索引部分。
B树和B+树的对比
在进行单点查询的时候,B 树的查询波动会比较大,因为每个节点即存索引又存记录,所以有时候访问到了非叶子节点就可以找到索引,而有时需要访问到叶子节点才能找到索引。
B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。
2.
B+ 树有大量的冗余节点,这样使得删除一个节点的时候,可以直接从叶子节点中删除,甚至可以不动非叶子节点,这样删除非常快,总的来说就是B+ 树的插入和删除效率更高。
3.
B树不支持范围查询,而B+树支持范围查询,因为 B+ 树所有叶子节点间还有一个双向链表进行连接,因此如果需要进行范围查询,那数据库索引应该选B+树