聚集索引和非聚集索引
概念
什么是聚集索引?
众所周知,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的数据,那么这样是可以直接返回的,无需找去查询聚集索引树。