前言
- InnoDB的索引数据结构是B+树,主键索引叶子结点的值存储的是MySQL的数据行,普通索引的叶子结点的值存储的是主键值。
1、聚集索引
- 聚集索引就是可以根据可以索引直接查找到数据,而不会再有回表过程的索引,主键索引就是聚集索引。
- 举例:
此时id是主键,现在的索引是id、k,那么两棵索引树的示意图:mysql> create table T( id int primary key, //主键 k int not null, //字段k name varchar(16), index (k))engine=InnoDB;//给k建立索引,引擎是innodb insert into(id,k) values (100,1),(200,2),(500,5),(600,6)
假如此时的sql语句为
那么,此时是可以根据查找到所需要的数据。select * from T where Id = 500
2、非聚集索引
- 索引的存储和数据的存储是分离的,即:通过索引但是没有找到数据,需要根据索引上的值再次回表查询,这就是非聚集索引。
- sql语句为
那么,就会先去k的索引树取查找k=5得到ID值为500,然后拿着ID=500再去ID索引树再搜索一次,要进行回表的。select * from T where k = 5
3、二者区别
- 通过聚集索引可以一次查找到需要的数据,非聚集索引需要回表才能找到需要的数据。
- 一张表聚集索引只能有一个,而非聚集索引可以有多个。