索引算法
1. 二叉树
1.1 二叉树特征
- 每个节点最多有两个子节点
- 左子节点和右子节点是有顺序的
2. 平衡二叉树(AVL树)
**平衡二叉树是一种特殊的二叉树,左右子树高度差不超过1,且每个子树都是平衡二叉树。**平衡二叉树的常用算法有红黑树、AVL、TREAP、伸展树、左偏树等。它在插入和删除的时候会通过特定算法自旋转来保持平衡,这种旋转比较耗时,因此比较适合插入和删除不是很多但查找多的情景。其查找效率是O(log(n)),n是树中元素的数目。
3. 红黑树
红黑树和AVL树都是自平衡二叉查找树,插入和删除元素时都会通过旋转来保持平衡。两者也有区别:
- 平衡的实现机制:AVL树是根据树的平衡因数(所有子树的左右节点高度差不超过1)和旋转来决定是否平衡。而红黑树是根据节点颜色和一些约定和旋转来决定是否平衡。
- 插入效率:红黑树的插入效率比AVL树高。因为红黑树并不追求“完全平衡”,这降低了对旋转的要求,从而提高性能。
- 性能:红黑树的查找、插入和删除效率都为O(log2n)。也就是说红黑树查找效率比AVL略低,但是插入和删除效率比AVL高。因此,两者相比较,AVL树更适合不频繁插入和删除的静态数据场景,如果需要频繁进行插入和删除则使用红黑树更好。
4. B树
略。以后再补充。
5. B+树(Mysql)
这里只说Mysql中的B+树。
5.1 特征
- 叶子节点存储了表的所有行记录
- 叶子节点是有序的
- 叶子节点之间是链表结构
5.2 走索引的前提下,Mysql是如何查询数据的
如上图,像上面索引值为30的行记录,mysql先把根节点加载到内存中通过折半查找法等算法快速定位到30所在的二级节点,然后把该二级节点的数据加载到内存中快速定位到30所在的叶子节点,进而再次通过折半查找法找到30的行记录。可以看出对于高度为3的B+树,一次查找需要进行三次磁盘IO(读取树节点到内存中)。此外,高版本的mysql会把非叶子节点默认都缓存到内存中,所以更是只要一次磁盘IO即可。