mysql 聚集索引 非聚集索引

聚集索引

索引是存储了表数据的物理地址

聚集索引既存储了表数据key又存储了行值,物理地址的逻辑顺序和表存储的顺序一致!是唯一的

对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则 如果一个主键被定义了,那么这个主键就是作为聚集索引 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

非聚簇索引:存放了表数据的物理地址和key值,可根据key值对应的物理地址再查询具体的行值,但是物理地址存放的顺序和表存放的逻辑顺序没有强一致性!

基于主键索引和普通索引的查询有什么区别?

mysql> create table T( id int primary key,k int not null,name varchar(16),index (k))engine=InnoDB;

(ID,k) 值分别为 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6)

 

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚集索引(clustered index)。

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

 

如果语句是 select * from T where ID=500,即 主键查询方式,则只需要搜索 ID 这棵 B+树 ;

如果语句是 select * from T where k=5,即 普通索引查询方式,则需要先搜索 k 索引树,得到 ID的值为 500,再到 ID 索引树搜索一次。这个过程称为回表

 

 

mysql不允许允许来建立聚簇索引,当你为每个表设置主键的时候,该主键就自动成为了聚簇索引,聚簇索引和二级索引最大的区别是,聚簇索引不需要回表查询,而二级索引需要,聚簇索引默认也是b-tree,但是在叶子结点上存储的是主键值对应的该行的所有值,而二级索引的叶子节点默认存储的是二级索引对应的主键值,都是以key,value的形式存储的,当通过主键查找到某个值的时候可以根据该主键查找到所在的叶子结点并且返回所对应的row,而通过二级索引查找时,默认返回叶子节点上存储的主键值,再用该主键值进行回表查询,这就是聚簇索引和二级索引最大的区别

 

 

你可能感兴趣的:(MySQL)