上一篇介绍了介绍了B+树的索引方式,其实还有其他的索引方式,本篇就来了解下,顺便看一下innoDB当时为什么没有选择其他的索引方式,而是选择了B+树作为默认的索引方式。
PASS,这个就不用比较了。
Hash算法是通过某种确定性算法(比如MD5, SHA1, SHA2, SHA3)将输入转变为输出。相同的输入永远可以得到相同的输出。
加速查找速度的数据结构,常见的有2类:
Hash结构效率很高,那为什么索引结构要设计成树型呢?
Hash索引使用存储引擎情况如下表,只有Memory存储引擎支持。
Mysql的Memory存储引擎支持Hash索引,如果需要用到查询的临时表时,可以选择Memory存储引擎。然后把某个字段设置为Hash索引,当字段的重复度低,并且经常需要进行等值查询的时候,采用Hash索引是个不错的选择。
另外,InnoDB本身虽然不支持Hash索引,但是它提供了自适应Hash索引(Adaptive Hash Index)。比如某个数据经常被访问,那么InnoDB就会将这个数据页的地址存放到Hash表中。这样下次再进行相同的检索条件时,就可以直接找到这个页面的所在位置了。
可以通过innodb_adaptive_hash_index变量来查看是否开启了自适应Hash:
mysql> show variables like '%adaptive_hash_index';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON |
+----------------------------+-------+
1 row in set (0.33 sec)
1、二叉搜索树的特点
二叉搜索树的缺点是在特别情况下,查找数据的时间复杂度会退化为O(n)。比如下图:
为了避免上图的情况,当然核心是为了减少磁盘I/O的次数,就需要尽量降低树的高度。
为了解决上面二叉搜索树退化为链表的问题,又提出了平衡二叉搜索树(Balanced Binary Tree),又称为AVL树:
它是一颗空树,或者它的左右两个子树的高度差不超过1,并且左右两个子树都是一颗平衡二叉树。
为了尽可能的降低磁盘I/O的次数,也就是降低树的高度,因此可以将二叉树改为M叉树(M>2),这样树的高度就可以变得更低一点了。
当上面提到的M叉树的M值更大的时候,就可以理解为是一颗B树了。
注意区分下B树和B+树的区别。
B树的目录项记录里面是直接包含了用户记录数据的,而B+树只有叶子节点才包含用户记录数据的。
那为什么使用B+树,不适用B树呢?