js css htmljava学习之路

JavaGuide知识点整理——MySQL索引

2022-09-08  本文已影响0人  唯有努力不欺人丶

何为索引?有什么作用?

索引是一种用于快速查询和检索数据的数据结构,常见的索引结构有:B树,B+树和hash
索引的作用就相当于书的目录。

索引的优缺点

优点:

缺点:

索引不一定能提高查询性能,大多数情况下索引查询都比全表扫描要快的,但是如果数据库的数据量不大,那么使用索引也不一定能带来很大的提升。

索引的底层数据结构

Hash表

哈希表是键值对的集合,通过键即可快速取出对应的值。因此哈希表可以快速检索数据。
但是哈希算法有个hash冲突。也就是说多个key得到同一个value。通常情况下我们常用的解决方法就是链地址法。就是将同一hash的数据存放在链表中。
既然哈希表这么快,为什么MySQL没有使用其作为索引的数据结构呢?

  1. hash冲突问题
  2. Hash索引不支持顺序和范围查询。

B树和B+树

B树也叫B-树,全程是多路平衡查找树。B+树是B树的一种变体。B是balanced(平衡)的意思。

B树和B+树异同:

MyISAM引擎中,B+树的叶子节点数据存放的是数据记录的地址。然后根据地址读取对应的数据记录,这叫做非聚簇索引。
InnoDB中,叶子节点key是数据表的主键,data中保存了完整的数据记录。这种叫聚簇索引。而其余的索引都叫做辅助索引。辅助索引的data存放的是记录主键的值而不是地址。在使用时,如果查询的是主索引,则直接获取key对应的数据。如果是辅助索引查找,则先获取主键的值,再走一遍主索引。

索引类型

主键索引

数据表的主键列使用的就是主键索引。
一张表只能有一个主键(但可以是多个列组成的联合主键),且主键不能为null,不能重复。在MySQL的InnoDB表中,如果没有显示指定表的主键,InnoDB会自动先检查表中是否有唯一索引且不允许存在null值的字段。如果有则默认该字段为主键。否则InnoDB会自动创建一个6字节的自增主键。

二级索引(辅助索引)

二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说通过二级索引,可以定位主键的位置。
唯一索引,普通索引,前缀索引等都属于二级索引。

聚集索引和非聚集索引

聚集索引

聚集索引即索引结构和数据一起存放的索引,主键索引属于聚集索引
聚集索引的优点:
聚集索引的查询速度非常快,因为整个B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点相当于定位到了数据。
聚集索引的缺点:

非聚集索引

非聚集索引即索引结构和数据分开存放的索引。
二级索引属于非聚集索引。非聚集索引的叶子节点并不一定存放数据的指针,因为二级索引的叶子节点就存放的是主键,根据主键再回表查数据。
非聚集索引的优点:
更新代价比聚集索引小。因为非聚集索引的叶子节点不存放数据。
非聚集索引的缺点:

非聚集索引一定要回表查询么?

非聚集索引不一样回表查询。因为可能查询的字段正好是索引,那么直接取key就行了。这种情景叫做覆盖索引。

覆盖索引

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为覆盖索引。覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了,无需回表查询。

联合索引

使用表中的多个字段创建索引,就是联合索引,也叫做组合索引或者复合索引。

最左前缀匹配原则

在使用联合索引的时候,MySQL会根据联合索引中字段顺序,从左到右依次到查询条件中匹配。直到联合索引中全部字段匹配完成或者遇到范围查询才会停止。
所以我们使用联合索引时,可以将区分度最高的字段放在最左边。

索引下推

MySQL5.6中提供的索引优化功能,可以在非聚簇索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表次数。

创建索引的注意事项

  1. 选择合适的字段创建索引

    • 不为null的字段:因为数据为null 的字段数据库比较难优化
    • 被频繁查询的字段
    • 被作为条件查询的字段
    • 频繁需要排序的字段
    • 被经常用于连接的字段
  2. 被频繁更新的字段应该慎重建立索引
    因为索引的维护成本不小。如果一个字段经常被修改且不经常被查询,不应该建立索引。

  3. 尽可能的考虑建立联合索引而不是单列索引
    因为索引需要占用磁盘空间,可以简单理解为每一个索引都对应一棵B+树。如果一个表索引过多,那么索引占用空间也是很多的,且修改的时候耗费的时间也多。如果是联合索引,多个字段在一个索引上,会节约很大磁盘空间。

  4. 注意避免冗余索引
    如果同时建立a,b,c。 a,b。 a。这三个索引,就算是冗余索引。

  5. 考虑再字符串类型的字段上使用前缀索引代替普通索引
    前缀索引仅限于字符串类型,较普通索引会占用更小的空间。

使用索引的一些建议

本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注。也祝大家工作顺顺利利!生活愉快~

上一篇 下一篇

猜你喜欢

热点阅读