聚集索引和非聚集索引

概念

​ 什么是聚集索引?

​ 众所周知,innodb中索引的组织形式是B+树,非叶子节点存key,叶子节点存key+data,叶子节点之间用指针联通。

​ 聚集索引则在data存放是数据页

​ 什么是非聚集索引?

​ data中存放的是主键的值,得到主键后还需要在聚集索引上再查询一次

索引和表的关系

​ innodb存储引擎表是索引组织表,这代表着表数据是按主键顺序存放。而每张表都有个主键(没设主键会隐藏生成一个),主键即为聚集索引。那么换句话说,表中数据存储实际上采用的是B+树存储。

聚集索引和物理存储上的关系

​ 很多资料上说聚集索引按照顺序物理存储数据,如果真是这样的话,那么为何这个顺序的开销必然很大,所以并不是物理上连续,而是逻辑上连续。其中有两点,一、前面说数据页通过链表链接,页按照顺序排序,二、页中的记录也是通过链表链接。在物理存储上不按主键存储 –《innodb存储引擎》

主键和聚集索引的关系

​ 如果设置主键那么主键为聚集索引

​ 如果没有设置,第一个非空的唯一索引则为聚集索引

​ 如果再没有,自动隐藏创建个主键当做聚集索引

非聚集索引

​ 除了聚集索引剩下都是非聚集,聚集索引一张表只有一个,非聚集有很多。

​ 非数据索引也是一颗数,在查询的时候先通过非聚集索引数找到主键id,在通过主键id在聚集索引树上找到对应数据

联合索引

​ 创建个索引(A,B,C)其实会创建三个索引,A,AB,ABC,很多资料上说最左前缀法则就能使用上索引

​ 如果where C B A则不能,其实不然,mysql当做有个优化器,可以调整条件顺序,只要有开头就能使用上索引,即这个场景下只要有A就能使用索引。

​ 如果中间断了 即(C,A)也是可以使用索引,不过有个extra查询消耗

​ 不信可自行explain

覆盖索引

​ 因为非聚集索引需要查询两次,但是有种情况是只需要一次的,那就是索引即是返回数据

​ 如果定义非聚集索引(A,B)

​ 查询的时候select B from tabel where A = 1;

​ 那么在B+树中的叶子节点中的key已经存放了A,B的数据,那么这样是可以直接返回的,无需找去查询聚集索引树。