1.0 Mysql索引的数据结构与算法

Mysql索引的数据结构与算法

一、索引

索引是高效获取排好序数据结构

索引本身就是数据一部分关键信息,通过索引大大减少索引的数据量。

索引信息需要额外的空间存储。创建和维护索引本身也会降低对数据的操作性能。

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

需要了解常用的索引数据结构:

  1. hash表
  2. B-Tree和B+树

1.1 hash表

img

优点:键值的集合,通过键(key)即可快速取出对应的值(value),接近 O(1)

缺点

  1. Hash冲突问题(需要设计更好的哈希算法和更大的空间分散)
  2. 仅能满足 “=”,“IN”,不支持顺序和范围查询(最大的缺点)
// 举例哈希算法
hash = hashfunc(key)
index = hash % array_size

哈希冲突:多个不同的 key 最后得到的 index 相同

1.2 B-Tree和B+树

B树

image-20221215150251085

  1. 叶节点具有相同的深度,叶节点的指针为空
  2. 所有索引元素不重复
  3. 节点中的数据索引从左到右递增排列

B+树(InnoDB使用)

image-20221215150447391

  1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  2. 叶子节点包含所有索引字段
  3. 叶子节点用指针连接,提高区间访问的性能

1.3 聚簇索引和非聚簇索引

索引和数据的存放位置不同分为聚簇索引,非聚簇索引

非聚簇索引:MyISAM索引文件和数据文件是分离的。由于数据和索引信息是分离的,在使用的时候就需要付出更大的io成本。

image-20221215151335220

聚簇索引:InnoDB索引和数据源文件是聚合的。

image-20221215151728499

image-20221215151741250

  1. 表数据文件本身就是按B+Tree组织的一个索引结构文件
  2. 聚集索引-叶子节点包含了完整的数据记录
  3. InnoDB表必须建主键,并且推荐使用整型的自增主键(更小的cpu和io成本)
  4. 非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)

1.4 联合索引结构

image-20221215152533084

最左前缀索引原则就是由联合索引结构决定的。

以联合索引字段从左到右的顺序优先级组织数据文件,而形成的B+树结构

posted @ 2022-10-14 15:14  浮沉丶随心  阅读(38)  评论(0编辑  收藏  举报