主要说明BTree和Hash索引
1.常用的加快查找速度的数据结构
树:
二叉查找树:查询/插入/修改/删除的平均时间复杂度都是O(n)
平衡二叉树:查询/插入/修改/删除的平均时间复杂度都是O(logn)
红黑树:查询/插入/修改/删除的平均时间复杂度都是O(logn)
哈希:
HashMap:查询/插入/修改/删除的平均时间复杂度都是O(1)
HashSet:查询/插入/修改/删除的平均时间复杂度都是O(1)
总结:
如果是对单行的数据进行查询,很明显哈希索引很快,但是由于mysql不能确定两个值之间会存在多少行的数据,这时使用哈希索引,它的时间复杂度会退化为O(n),而树型的索引的时间复杂度仍然是O(logn)
2.BTREE索引与HASH索引
MyISAM 和 InnoDB 存储引擎的表默认创建的都是 BTREE 索引
(1).Hash索引
~ 只用于使用=或<=>操作符的等式比较。
~ 优化器不能使用 HASH 索引来加速 ORDER BY 操作。
~ 只能使用整个关键字来搜索一行。
~ 由于mysql不能确定两个值之间会存在多少行的数据,数据多时使用树型索引
(3)BTree索引
(1)B树
~ 由于B树不同于二叉树的二叉搜索,B树可以进行m叉搜索
~ B树的非叶子节点和叶子节点都可以存储数据,优于二叉树的每个节点存储的是记录
~ B树可以通过中序遍历获得所有的节点
(2)B+树
~ 在B树的基础上进行了改进,仍然是m叉搜索树
~ B+树非叶子节点不在存储数据,而是将数据存储在同一层的叶子节点上。(B+树中根到每一个节点的路径长度一样)
~ 叶子之间,增加了链表,获取所有节点,不再需要中序遍历
3.B树索引和B+树索引比较
(1)B树适合做索引的原因
~ B树充分的利用到了磁盘预读(不是按需读取,按页读取,一次读一页(4k),如果之后读取的数据存在预读的数据中,那么就可以很好的提高I/O效率)--依据局部性原理
~ 由于B树是m分叉的,所以树的高度能够降低很多;
~ 每个节点可以存储n个记录,如果将节点大小设置为页大小,可以利用磁盘预读,极大减少磁盘IO;
(2)B+树比B树更适合做为索引的原因
B树:有序数组+平衡多叉树,B+树:有序数组链表+平衡多叉树;
范围查找:定位min与max之后,中间叶子节点,就是结果集,不用中序回溯;
叶子节点存储实际的数据记录,适合数据量大的磁盘存储,非叶子节点存放是记录的key,可以存放更多的索引
总结:
B+树的查询效率更高效
B+树的磁盘读写代价更低
B+树空间利用率更高,可减少I/O次数