240808-索引的数据结构

87 阅读3分钟

索引的数据结构

参考文献的两篇文章写得很好,就不再写一遍了,以下仅罗列下提纲

什么是索引

索引是存储引擎用于快速查找数据纪录的一种数据结构。

  • 最典型的例子就是查新华字典,通过查找目录快速定位到要查找的字。
  • 数据是存储在磁盘上的,查询数据时,如果没有索引,会加载所有的数据到内存,依次进行检索,读取磁盘次数较多。
  • 使用索引,就不需要加载所有数据,MySQL是以B+数的数据结构存储索引,B+树的高度一般在2-4层,最多只需要读取2-4次磁盘,查询速度大大提升。

索引的优缺点

优点

  • 避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页,提升查询语句的执行效率
  • 在使用分组和排序语句进行数据检索时,可以显著减少查询中分组和排序的时间
  • 多表连接查询,提高从其他表检测行数据的性能
  • 如果表具有多列索引,则优化器可以使用索引的最左匹配前缀来查找,提升数据检索的性能

缺点

  • 会降低表的增删改的效率,因为每次对表记录进行增删改,需要进行动态维护索引

索引的数据结构

MySQL索引常见的数据存储结构有哈希结构,B+树结构,R树结构。其中R树结构用于空间索引,不常见
B+数最常用,适于范围查询
哈希结构适于精准匹配

B+树利用了平衡二叉树原理,同时对B树做了优化(非叶子节点不存储数据,把数据存在叶子节点)
其余不多赘述,可以看第一个参考文章!!!

聚集索引与非聚集索引

  • 聚集索引(主键索引)

以主键为键建立B+树,叶子节点存储该主键对应的行数据(没有主键,系统会创建一个隐式主键)

  • 非聚集索引

以非主键列为键建立B+树。
非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表

示例

假设username是t1的非聚集索引

  • 不需要二次查询

select id, username from t1 where username = '小明'

  • 需要二次查询(需要二次的查询去获取原数据行的score)

select username, score from t1 where username = '小明'

更多聚集索引与非聚集索引的内容可以看参考文献2!!!

索引类型

  1. 主键索引
  2. 唯一索引
  3. 组合(联合)索引
  4. 普通索引

其他更多索引知识可以参考下面两篇文章

参考文献

MySQL的索引——索引的介绍及其数据结构B+树 & 索引的类型 & 索引的使用及其失效场景 & 相关名词解释_mysql的索引结构-CSDN博客
什么是聚集索引和非聚集索引及其两者区别?_聚集索引和非聚集索引的区别-CSDN博客