什么是索引?
索引可以理解为书的目录,如果没有索引的存在,我们只能挨个去寻找。但是有了目录后,我们就可以根据目录去定位到数据
索引的类型:
- hash索引,以key-value形式存储,如果碰到hash值一样的,则拉出一个链表来。因为不是有序的,所以做区间查询是很慢的,适用于只有等值查询的场景
- 有序数组,有序数组索引只适用于静态存储引擎,比如你要保存的是 2017 年某个城市的所有人口信息,这类不会再修改的数据。使用二分法查找
- 搜索树:二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子,时间复杂度是 O(log(N))

InnoDB 的索引模型
InnoDB使用B+树索引模型,每一个索引在InnoDB中都对应一个B+树
InnoDB索引类型
索引类型分为主键索引和非主键索引。
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
基于主键索引和普通索引的查询有什么区别?
当基于主键索引查询时,可以通过主键索引直接找到数据项。但通过普通索引查询时,需要在这个字段的索引上找到对应的ID,然后再在主键索引上
找到对应的数据,这个过程称之为回表。
索引的维护
一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。从性能和存储空间方面考量,自增主键往往是更合理的选择。
