- 前言
知道索引,才知道MySQL的查询优化,本文主要介绍索引的演变过程以及MySQL使用的B+-Tree索引
- 什么是索引
大家小时候都使用过新华字典吧,
当需要找一个文字的时候,有两种方法,一种是一页一页的翻,找到自己想要找到的文字,一种就是根据汉语拼音音节索引来查询
假设我们要查询 汉字 吹 ,
- 根据第一种方法,我们需要至少翻71页才可以查询到这个汉字
- 第二方法,翻一次汉语拼音音节索引,再翻到71页即可,只需要翻2次
这就是索引,为了提高我们的查询效率,节约不必要的时间
- 二叉查找树( Binary Search Tree)
官方说法:
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
大白话:
二叉查找树是数据结构中的一类,一般查找情况下,比链表结构效率高,
定义:
- 每个节点至多只有两个子节点,指向自己的左子树和右子树
- 每个节点的键都
大于左子树中任意节点的键,小于右子树中任意节点的键 - 左右子树也分别为二叉树
- 查找所需
最大次数为二叉查找树的高度决定
当我们要查找 3 这个数值,在二叉查找树中的流程就是
优点
- 增删查速度快,平均时间复杂度均为O(logn)
缺点
- 可能出现类似线性链表的结构,查找的时间复杂度会变成O(n)
- 平衡二叉树
是一种可以自平衡的树,从上面的二叉查找树升级过来的,以二叉查找树为基础,增加了平衡的规定:左子树和右子树的高度差最多为1,并且左右两个子树都是平衡二叉树
定义:
- 引入
平衡因子:节点左子树高度-节点右子树高度 - 平衡二叉搜索树的任何结点的左子树和右子树平衡因子高度最多
相差1. - 每一次插入结点操作最多只需要旋转
1次(单旋转或双旋转) - 旋转分为LL,LR,RL,RR,旋转过程参考blog
优点
- 解决了二叉查找树退化成链表的缺点,最坏的查找时间复杂度也为O(logn)
缺点
- 因为平衡二叉树要求每个节点高度最多
相差1,所以每次的插入/删除节点,容易破坏平衡规则,需要频繁旋转调整,这种场景下平衡数性能降低.