索引的分类
主键索引:设定为主键后数据库会自动建立索引,主键不能为空
单值索引:除主键外的其他某一列设置的索引
复合索引:一个索引包含多个列
唯一索引:索引列的值唯一,允许为空,只能存在一个null
show index from 表名; --查看表中索引
B+Tree是在B-Tree(B树)结构基础上的一种优化,使其更很适合实现外存储的索引结构,InnoDB存储引擎就是使用B+Tree实现其索引结构。
B+Tree与B-Tree(B树)最大的区别就是,B树非叶子节点必须存储数据,而每页存储空间是有限的,如果存储的数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时,会导致B树的深度很大,从而增大了查询时磁盘的I/O次数,影响查询效率。而B+树只有叶子节点存储数据,非叶子节点不存储数据,只存储索引和指针即key值信息,这样大大加大了每个节点存储key的数量,进而页目录存储的数据可以更多,树的深度更小。
B+树相对于B树有几点不同:
将数据存储与索引放到一块,索引结构的叶子节点保存了行数据。
一般来讲,一个表中的主键索引一定是聚簇索引,但聚簇索引不一定就是主键索引。
如果数据存储和索引放到了一起,叶子节点存储的是整行数据,这就是聚餐索引
将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。辅助索引叶子节点存储的不再是行的物理位置,而是主键值,辅助索引访问数据总是需要二次查找
非聚簇索引中最终找到的是对应的id,然后根据该id值在聚簇索引中找数据。
为什么存id主键值,而不直接存数据地址,根据地址去找?
因为在增删改的过程中,原数据的地址会发生变化,而主键是一直不变的。