聚集索引和非聚集索引

聚集索引和非聚集索引概念

​ 什么是聚集索引?

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

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

​ 什么是非聚集索引?

​ 非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成。data中存放的是主键的值,得到主键后还需要在聚集索引上再查询一次

索引和表的关系

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

主键和聚集索引的关系

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

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

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

非聚集索引

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

​ 非数据索引也是一颗数,在查询的时候先通过非聚集索引数找到主键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的数据,那么这样是可以直接返回的,无需找去查询聚集索引树。

原文地址:https://www.cnblogs.com/bushishucai/p/11289558.html