【Mysql篇】索引是什么?索引的底层模型是什么?索引失效场景以及失效的原理

索引

1. 索引是什么

索引是一种优化查询的数据结构,是表的一部分,记录这表里所有记录的引用指针,可以理解为一本书的目录

2. 索引的优点(加快查询效率)

  1. 查询效率变快
  2. 唯一索引可以保证数据行的唯一性
  3. 加速表与表之间的连接
  4. 在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间

3. 索引的缺点(占用空间、更新变慢)

  1. 创建索引和维护索引需要时间,随数据量的增加而增加
  2. 索引占用空间
  3. 更新数据的同时会更新索引,降低了更新的速度

4. 索引的类型

1. hash

HASH的唯一(几乎100%的唯一)及类似键值对的形式,特点:“=”和“in”条件下高效,对于范围查询、排序效率不高

2. 平衡二叉树AVL

1. 定义

左子树和右子树的高度差不会超过1(通过左旋右旋来实现的)
在这里插入图片描述

2. 问题
  1. 随着数据量的增加,数的高度会越高,查询的效率会变慢
  2. 对于范围查询,需要用到回溯算法进行查找,效率特别慢

3. B树

1. 定义

每个节点最多可以存放2个数据,从而降低了树的高度,但对于范围查询还是需要回溯的

2. 特点

3. B+树(mysql索引推荐的存储结构)

1. 定义

一个节点存放2个值,叶子节点冗余存放数据,且根据从小到大形成一个单向链表

2. 特点

5. 索引的种类

1. 聚集索引(如主键索引、唯一的隐式非空索引)

1. 定义(数据和索引放到一起)

在数据库里面,所有行数都会按照主键索引进行排序,一张表就只有一个聚集索引。

白话文:可以没有主键索引,但一定会有聚集索引

2. 非聚集索引(数据和索引分开)

就是给普通字段加上索引。

3. 联合索引

就是好几个字段组成的索引,称为联合索引。
联合索引遵从最左前缀原则

6. 什么时候需要创建索引

  • 主键自动建立唯一索引(ID)

  • 频繁作为查询条件的字段应该创建索引、一般创建联合索引(Where)

  • 查询中排序的字段创建索引将大大提高排序的速度(Order By)

  • 查询中统计或者分组的字段(Group By)

7. 什么时候不需要创建索引

  • 频繁更新的字段不适合创建索引
  • where条件里用不到的字段,不创建索引
  • 表记录太少,不需要创建索引
  • 数据离散度小的字段,不需要创建索引,例如性别

8. 哪些情况会不走索引

  1. Like:%在前面的话不走索引,%在后面的话还是会走索引的
  2. 索引列有计算操作,不走索引
  3. 索引列使用了函数,不走索引
  4. 索引列使用了不等(!=)符号,不走索引
  5. 不满足联合索引的最左前缀原则,不走索引
  6. or操作,不走索引(可以用union替代)
  7. 索引列的字段具体值为null,不走索引,进行全表扫描(很关键
  8. 字符串列与数字直接比较,字段属性是字符,但是你用数据类型去比较,不走索引(因为隐式类型转换,mysql5.7之后是可以使用到索引的)
  9. order by操作的索引列如果也在where条件里,则不走索引
  10. 对于联合索引,范围查询如between、>、< 这些条件,会造成后面的索引字段失效

9. 主键和索引的区别

  • 主键一定是唯一索引,唯一索引并不一定就是主键。

  • 一个表中可以有多个唯一性索引,但只能有一个主键。

  • 主键列不允许为null,唯一性索引列允许为null

10. 索引失效的原理

在这里插入图片描述

1. 联合索引为什么会失效

比如联合索引是A,B,C,生成的B+树的那个单向链表,是先根据A排序,A相同的再根据B排序,以此类推

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值