二叉查找树
- 左子树比根节点小
- 右子树比根节点大
- 通过中序遍历,得到从小到大的排序
数据查找方式,如查询 5 的记录,
先找根节点 8,8大于5;
查找8的左子树,找到4,4小于5;
查找4的右子树,找到5;
一共找了3次
二叉查找树可以任意构造,极端情况下会退化成链表,如图所示
如果想要查询9,需要遍历整个链表,查询6次,查询效率就低了。这时候就需要这棵树是平衡的,于是就有了平衡二叉树,也叫AVL树
平衡二叉树(AVL树)
- 首先,满足二叉查找树定义
- 其次,所有节点的左右子树最大高度差不超过1
平衡二叉树查询速度快,但是维护这棵树的代价比较大,为了保持平衡,每当有数据加入或删除时,需要通过多次左旋或右旋操作来保持树的平衡。
B+树
B+树是一棵多路搜索树,和二叉树相比,一个父节点下可以有多个(大于2)子节点,各个叶子节点上的数据都是有序的,
和B-树比特殊的地方:
- 所有数据存放在叶子节点上
- 非叶子节点作为叶子节点的索引
- 叶子节点之间由双向指针组成一个双向链表
索引
MySQL中索引基于B+树结构存储,数据库中B+树的高度一般在2~4层,也就是查找某一键值最多需要2 ~ 4 次IO。
B+树索引分为聚集索引和辅助索引,聚集索引和辅助索引不同的是叶子节点存放的是否是完整的信息
聚集索引
由表主键构成的一棵B+树,也叫主键索引。
叶子节点存放数据页,每个数据页之间通过双向链表进行链接
单个数据页中的数据是有序存放的
辅助索引
由表除主键外的其他字段构成的一棵B+树
叶子节点存放索引键值 + 主键值
查找数据时,先在辅助索引里查找,如果辅助索引里的字段满足查询返回所需的数据,则直接返回;否则进行回表查询,根据主键按照主键索引定位数据页,从数据页中找到所需的数据
联合索引
联合索引也是一种辅助索引,是由多个字段组成的一个B+树。
遵循最左匹配原则
覆盖索引
又称为索引覆盖,从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。使用覆盖索引,可以减少回表操作,降低IO操作
唯一索引
不允许列有重复的值,和主键一样,同样可以提高访问效率。
索引失效原因
-
根据普通索引查询某一范围表中所有字段数据,导致索引失效。
例如 select * from tb_user where no > 12345;
由于需要查询整张表中的数据,通过普通索引只能找到主键,还需要回表根据主键查询其他字段信息,虽然普通索引是有序的,如果再进行一次回表,则查找的数据就变成无序了,在磁盘上变成了随机读操作。如果访问量小,查询优化器还是会选择普通索引,但是访问数据量比较大(一般是整表的20%左右),优化器会选择主键索引来查找数据,因为顺序读取要远远快于随机读。 -
使用联合索引,未遵循最左匹配原则进行SQL查询
-
查询条件使用函数在索引列上,导致索引失效,例如:timestamp(column) = ‘2021-01-22’
-
使用 like 模糊查询百分号在前面,like ‘%xxxx%’(索引失效),like ‘xxx%’ 索引还是有效的