索引:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像一本书的目录一样,可以加快查询速度,提高数据库的性能。但是在插入、更新、删除时都需要对索引结构进行维护,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。
聚簇索引和非聚簇索引
聚簇索引也称为主键索引,其索引树的叶子节点中存的是整行数据,数据只能存放在某一个叶子节点中,所以一个表只能包含一个聚集索引。InnoDB 存储引擎的索引模型底层实现数据结构为B+树,所有数据都是存储在 B+ 树中的。
非聚簇索引(普通索引)以主键以外的列值作为键值构建的B+树,叶子节点内容是主键索引的键值。要查找数据库中对应数据,还需要用键值在聚簇索引的B+树中在查找一次,这个过程叫做回表。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
示例:创建一张user表,其中id字段为主键,主键上自动创建了主键索引。uid字段上则是普通索引。
create table User( id int primary key, uid int not null, name varchar(16), index (uid))engine=InnoDB;
假设主键索引对应的B+树结构如下图,那么叶子节点保存的对应data值为数据库中某一行数据,在搜索过程中,只要根据主键指找到其对应的data就能找到对应数据库中的具体数据。比如查找18,通过二分查找最后找到18对应的值(18,kl),其中kl表示存储的18为主键的数据库行的具体值。
假设是非聚簇索引对应的B+树,叶子节点对应的则是聚簇索引对应B+树的key。比如下图中获取uid为33的key对应的值为33-47,也就是uid为33索引的主键id为47,那么在根据47在上面的聚簇索引树中进行搜索即可。
B+树简述
- B+树只有叶子节点存储数据(value),其他非叶子节点存储键值(key)
- B+树的数据是按照顺序排列的