InnoDB 支持的索引类型
B+Tree索引、自适应Hash索引、全文索引
B+Tree索引
在Mysql中索引其实就是B+Tree索引,B+Tree索引的本质就是B+Tree在数据中的实现,表中的数据是按照主键的顺序存放。
B+Tree则是由B树+索引的顺序访问演化而来。B+Tree是专门为磁盘存储以及其他直接存取设备设计的一种平衡查找树。在B+Tree中,所有记录节点都是按照键值的大小顺序的存放在同一层级的叶子节点上,每个叶子之间通过指针进行连接。
B+Tree具有高扇出的特性,所以数的高度不会很高,一般2 ~ 4 层,也就意味着查找一条记录最多只需要 2~4次的IO
B+Tree索引并不能找到一个给定键值的具体行,只会找到行所在的页,然后数据库把页读到内存中,再在内存中进行遍历查找
B+Tree的插入操作
B+tree的插入必须保证插入后叶子节点依然是保持排序的,插入操作存在三种可能,每种可能对应的算法不一样,分别是:
a、Leaf Page 和Index Page都没满,直接插入
b、Leaf Page满了,Index Page没满,需要拆分Leaf Page页(拆分页就意味着磁盘操作,为了减少拆分页,B+Tree采用类似平衡二叉树的旋转功能,达到平衡)
c、Leaf Page 和Index Page 都满了,两次拆分页
B+Tree的删除操作
B+Tree 的删除操作采用填充因子(fill factor)来控制数的删除变化;B+Tree的删除操作同样必须保证删除元素后叶子节点依然保持排序;删除操作存在三种可能,根据填充因子来衡量
B+Tree索引分类
B+Tree索引分为聚集索引和非聚集索引(辅助索引);最大区别是叶子节点上是否存放的是一整行的记录数。
聚集索引:就是每张表的主键构造的一个B+Tree树,叶子节点存放的是整张表的行记录数,每个叶子通过双向链指针连接;
每张表只有一个主键,所以每张表也只有一个聚集索引,查询优化器更倾向于聚集索引;
优点:主键的排序查找和范围查找速度非常快;
非聚集索引(辅助索引):叶子节点并不包含行记录数的全部数据,叶子节点除了包含键值以外,还有一个标签(bookmark),这个标签可以告诉innoDB存储引擎在哪里可以找到与索引对应的行数据;
每张表可以有多个辅助索引,通过辅助索引查找数据时,InnoDB存储引擎会遍历辅助索引并通过一个页级别的指针获得指向主键索引的主键,然后再通过主键索引来获取整行的记录数;
联合索引:对表中的多个列创建索引;
覆盖索引:从辅助索引中就能拿到需要的数据,而不需要查询聚集索引中的记录;
优点:辅助索引中不包含个整行记录数,大小远远小于聚集索引,导致同一个叶子节点中存放的记录数会更多,减少大量的IO操作;
索引提示:强制优化器使用哪个索引进行查询
可能需要索引提示的情况:
a、数据库查询优化器选择了一个不合理或者错误的索引查询,导致性能低下,开发人员可通过force index的方式强制使用某个索引;
b、表中有多个索引使用时,查询优化器选择的索引开销很大,则需要开发人员强制指定某个索引进行查询
use index 和force index区别:
use index只是告诉查询优化器可以选择这个索引,实际上查询优化器还是会按照自己的判断来选择;
force index 是强制查询优化器必须使用这个索引
Hash索引:InnoDB存储引擎会根据表的使用情况自动为表生成Hash索引,不需要人为的干预;对范围查找无能为力
全文索引:是将存储在数据库中的整本书或者整篇文章中的任意部分信息查找出来的技术;