1.二叉搜索树
插入
搜索
删除
查找最大值
查找最小值
2.B+树
参考:
https://www.cnblogs.com/wade-luffy/p/6292784.html
3.InnoDB 索引模型
新建表:
create table T(
id int primary key,
k int not null,
name varchar(16),
index (k)
) engine =InnoDB;
insert into T (id,k) values(700,7);
insert into T (id,k) values(600,6);
.
.
.
insert into T (id,k) values(300,3);
insert into T (id,k) values(200,2);
insert into T (id,k) values(100,1);
所有的数据跟索引都存储在B+树中,如下图第一颗树是主键索引树,主索引树(clustered index)的叶子节点存的是整行数据,所以推荐用主键索引
右边的是非主键索引(senondary index)树,二级索引的叶子节点存储的是主索引的值;本例中就是id的值;
select * from T where id = 100 ; 本次查询仅需要查询主索引树即可;
select * from T where k = 1;普通索引查询,需要先搜索K索引树拿到主键id,在查询主键主索引树;这个过程称之为回表;
explain的试用
https://segmentfault.com/a/1190000008131735
QA
为什么推荐用主键自增id?
为了防止页分类,有利于提升性能和空间利用;(参考B+树的插入)
主键为啥越小越好?
主键长度越小,普通索引的叶子节点数据量就越小;
为啥是N叉树,不是二叉树?
与硬盘的寻址相关,为了尽量减少寻址;
什么是三星索引?
所有的查询where条件都有索引键中可以打上一星,查询结果列都有索引可以打上一星,order by 所在的列都有索引可以打上一星,如果满足以上三个条件可以称之为三星索引;大多数情况下无法达到三星;
为啥查询结果列也需要建索引(覆盖索引)?
如果查询条件为非主键索引时,查询结果列已经在索引树上,可以直接提供查询结果,无需回表;我们称之为“覆盖索引”
为啥排序列也需要建索引?
b+树 ,索引保证有序性,所以无需采用临时文件进行全字段排序或者rowid排序