create table test( id int(10) not null AUTO_INCREMENT,name varchar(3), PRIMARY KEY(id), UNIQUE KEY uqe_name(name) ) engine=innodb charset=utf8;
INSERT INTOtest
(id
,name
) VALUES (1, 'aa'), (2, 'bb'), (3, 'cc');
非聚集索引,索引和记录是分开存放的
primary key 和 secondary key
primary key记录使用B+tree,非叶子节点是pk值,叶子节点是row storage的指针
secondary key记录也使用B+tree,非叶子节点是索引值,叶子节点是row storage的指针
row storage 记录也使用B+tree,非叶子节点是指标,叶子节点是row的内容
explain select id,name from test where id = 1;
1 SIMPLE test NULL const PRIMARY PRIMARY 4 const 1 100.00 NULL
explain select id,name from test where name = 'aa';
1 SIMPLE test NULL const uqe_name uqe_name 12 const 1 100.00 Using index
聚集索引,如果有primary key则使用primary key作为聚集索引,如果没有则使用not null的unique key作为聚集索引
聚集索引使用B+tree,非叶子节点存放索引值,叶子节点存放row storage