目录
索引
1. 索引是什么
索引是一种优化查询的数据结构,是表的一部分,记录这表里所有记录的引用指针,可以理解为一本书的目录
2. 索引的优点(加快查询效率)
- 查询效率变快
- 唯一索引可以保证数据行的唯一性
- 加速表与表之间的连接
- 在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间
3. 索引的缺点(占用空间、更新变慢)
- 创建索引和维护索引需要时间,随数据量的增加而增加
- 索引占用空间
- 更新数据的同时会更新索引,降低了更新的速度
4. 索引的类型
1. hash
HASH的唯一(几乎100%的唯一)及类似键值对的形式,特点:“=”和“in”条件下高效,对于范围查询、排序效率不高
2. 平衡二叉树AVL
1. 定义
左子树和右子树的高度差不会超过1(通过左旋右旋来实现的)
2. 问题
- 随着数据量的增加,数的高度会越高,查询的效率会变慢
- 对于范围查询,需要用到回溯算法进行查找,效率特别慢
3. B树
1. 定义
每个节点最多可以存放2个数据,从而降低了树的高度,但对于范围查询还是需要回溯的
2. 特点
- 每个节点都存储指针和data,所有节点组成这棵树
- 叶子节点指针为null
图片链接:https://blog.csdn.net/qq_35529931/article/details/88925462
3. B+树(mysql索引推荐的存储结构)
1. 定义
一个节点存放2个值,叶子节点冗余存放数据,且根据从小到大形成一个单向链表
2. 特点
- 只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针
- 其他节点只存储指针,不存data
- 叶子节点还增加了顺序访问的指针
图片链接:https://blog.csdn.net/qq_35529931/article/details/88925462
5. 索引的种类
1. 聚集索引(如主键索引、唯一的隐式非空索引)
1. 定义(数据和索引放到一起)
在数据库里面,所有行数都会按照主键索引进行排序,一张表就只有一个聚集索引。
白话文:可以没有主键索引,但一定会有聚集索引
2. 非聚集索引(数据和索引分开)
就是给普通字段加上索引。
3. 联合索引
就是好几个字段组成的索引,称为联合索引。
联合索引遵从最左前缀原则
6. 什么时候需要创建索引
-
主键自动建立唯一索引(ID)
-
频繁作为查询条件的字段应该创建索引、一般创建联合索引(Where)
-
查询中排序的字段创建索引将大大提高排序的速度(Order By)
-
查询中统计或者分组的字段(Group By)
7. 什么时候不需要创建索引
- 频繁更新的字段不适合创建索引
- where条件里用不到的字段,不创建索引
- 表记录太少,不需要创建索引
- 数据离散度小的字段,不需要创建索引,例如性别
8. 哪些情况会不走索引
- Like:%在前面的话不走索引,%在后面的话还是会走索引的
- 索引列有计算操作,不走索引
- 索引列使用了函数,不走索引
- 索引列使用了不等(!=)符号,不走索引
- 不满足联合索引的最左前缀原则,不走索引
- or操作,不走索引(可以用union替代)
- 索引列的字段具体值为null,不走索引,进行全表扫描(很关键)
- 字符串列与数字直接比较,字段属性是字符,但是你用数据类型去比较,不走索引(因为隐式类型转换,mysql5.7之后是可以使用到索引的)
- order by操作的索引列如果也在where条件里,则不走索引
- 对于联合索引,范围查询如between、>、< 这些条件,会造成后面的索引字段失效
9. 主键和索引的区别
-
主键一定是唯一索引,唯一索引并不一定就是主键。
-
一个表中可以有多个唯一性索引,但只能有一个主键。
-
主键列不允许为null,唯一性索引列允许为null
10. 索引失效的原理
1. 联合索引为什么会失效
比如联合索引是A,B,C,生成的B+树的那个单向链表,是先根据A排序,A相同的再根据B排序,以此类推