一、索引用途
索引的目的在于提高查询效率,比如去图书馆借书,如果你要借某一本书,一定是先找到对应的分类科目,再找到对应的编号,最终找到这本书。索引就是帮我们加快查询速度,快速定位。
Mysql中B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree)。
二、B+树索引演变过程
①哈希表
优点:哈希表查询特定的值的时候,特别快,例如查a = 3。
缺点:
- 哈希表冲突会造成数据散列不均匀,会产生大量的线程查询,比较浪费时间。
- 不支持范围查询,当进行范围查询的时候,必须要全部遍历,例如查a > 3。
- 对于内存空间的要求比较高,读入内存需要将整个哈希表读进内存。
那么在mysql中有没有hash索引?
- Memory存储引挚使用的是hash索引。
- Innodb支持自适应hash索引(Innodb存储引擎自己决定是用hash索引存还是B+树存)。
②二叉搜索树
特性:插入数据的时候必须有序,左子树必须小于根结点,右子树必须大于根结点,使用二分查找来提高查找效率。
二叉查找树的查询时间复杂度比链表快,链表的查询时间复杂度是O(n),二叉排序树平均是O(logn)。二叉查找树越平衡,越能模拟二分法,所以与二分的思想相似,二叉查找树查询的时间复杂度O(logn)。
如果插入的结点的值的顺序,是越来越小或者越来越大的,那么BST就会退化为一条链表,那么其查询的时间复杂度就会降为O(n)。如下图所示:
③ 平衡二叉树
性质:通过左旋和右旋让树变平衡,最短子树和最长子树高度只差不超过1,为了保证平衡,在插入数据的时候必须要旋转,旋转消耗性能,插入时性能下降,而查询性能提升。