索引的由来
我们都知道InnoDB引擎是以页为单位进行增删改查的,各个页可以组成一个双向链表,而页中的记录会按照主键大小组成一个单向链表。所以我们要定位到某条记录的话要先定位到页,再定位到具体的记录。
如何定位到页?
InnoDB采用了一种叫B+树的数据结构。
-
叶节点存储真实有效的数据,
-
非叶结点用来定位,存放‘主键’+‘页号’(类似于目录的功能,这个目录就是索引)。
这棵根据主键建立的B+树,是InnoDB自动建立的。
如何定位到某条记录?
由于页内的每条记录都是按照主键大小排列的,所以采用二分查找就可以在页内快速的定位到某条记录。
聚簇索引
我们通常说的索引其实就是聚簇索引(按主键排序),它具有以下性质
-
使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:
- 页内的记录是按照主键的大小顺序排成一个单向链表。
- 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
- 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。
-
B+
树的叶子节点存储的是完整的用户记录。所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。
二级索引
聚簇索引是以主键进行排列的,二级索引是根据用户指定的列建立索引。这样子的话,
- 目录页存放:指定列+页号
- 叶节点存放:指定列+主键id
我们就构建出了第二棵B+树,如下图:
为某个列建立索引的意思其实就是在对应的B+树的记录中使用该列的值进行排序
如何查到所有的用户记录?
1、在二级索引树中,根据指定列查找到主键id。
2、然后在聚簇索引树中,根据主键id查找到所有的用户记录。(回表操作)
联合索引
与二级索引类似,在构造联合索引树的时候,采用多个用户指定列,其余都一样。
如何排序呢?
- 先按照第一列的值进行排序
- 如果第一列的值相同,则按照第二列的值进行排序,以此类推