1.1.1. 索引描述

索引是存储的表中一种特殊的数据结构。

聚簇索引

  1. 页内记录是根据主键大小顺序排列的单向链表。
  2. 各个存放用户记录的页是也是根据页内的用户数据的主键大小顺序存放的双向链表。
  3. 存放目录项的页可以分不同层次,每层次的目录项的页也是根据页中目录项记录的主键大小顺序存放的双向链表。
  4. B+ 树的叶子节点存放的用户的完整数据。

聚簇索引

二级索引

假如以 C2 列创建一个二级索引。

  1. 页内记录是按 C2 列大小顺序排列的单向链表。
  2. 各个存放用户记录的页也是根据页内记录的 C2 列大小顺序排列的双向链表。
  3. 存放目录项的页可以分不同层次,每层次的目录项的页也是根据存放目录项记录 C2 列大小顺序存放的双向链表。
  4. 叶子页存储的不是用户完整记录而是,C2 列和主键。
  5. 目录项记录的也不是 主键+页号,而是 C2 列+页号。

二级索引

如何根据二级索引查找一个记录
  1. 通过二分法找到记录存放在哪个页。
  2. 然后再在页中根据二分法查找出记录以及对应的主键。
  3. 最后通过主键进行「回表」,在聚簇索引中通过主键查找出完整的记录信息。
内节点中记录保持唯一性
c1 c2 c3
1 1 'u'
3 1 'd'
5 1 'y'
7 1 'a'

1

如果我们想新插入一行记录,其中c1、c2、c3的值分别是:9、1、'c',这个时候会导致 MYSQL 无法判断如何插入。所以需要保证在同一层的目录项记录除了页号之外是唯一的。所以增加一个主键来使其唯一。 所以现在目录项记录页共有三个值:索引列、主键、页号。

2

联合索引

假如以 C2 和 C3 列创建一个联合索引,具体做法和二级索引一样。不同的是:

  1. 页内记录会先按照 C2 列书序排列
  2. 在记录的 C2 列相同的情况下,再按照 C3 列进行排序。
  3. 每个目录项内部存储的是 C2 和 C3 和页号。
  4. 叶子页存储的是 C2 和 C3 和 主键。

联合索引

总结

  1. 每个索引都对应一个 B+ 树,最下面的是叶子页,其余的是内节点。叶子页存放着「用户记录」,内节点存放着「目录项记录」。
  2. InnoDB 会自动创建聚簇索引,叶子页存放着用户完整记录。
  3. 我们可以自己创建二级索引,叶子页存放的是索引列+主键,如果用二级索引查找用户完整数据,需要先通过二级索引查找数据的主键,再进行「回表」操作查询。
  4. B+ 数的每层节点都是通过主键从小到大顺序排序组成的一个双向链表。每个页内都是通过主键从小到大排序形成的一个单向链表。如果是联合索引,首先按照联合索引前面的列排序,如果列值相同,再通过联合索引后面的列进行排序。
  5. 通过索引查找记录是由根节点开始,一层一层往下搜索,由于每个页面都是按照索引列的值建立了 Page Directory(页目录),所以操作非常快。
Copyright © Kagami丶 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-12-10 20:25:25

results matching ""

    No results matching ""