索引

索引的出现就是为了提高数据查询的效率,如书的目录

常见索引结构

索引通常有几种常用的数据结构

  • key-val结构(hash)
    优点:查询速度快
    缺点:范围查询效率低
    适合等值查询
  • 有序数组
    如下,将数据根据id递增的顺序,直接存放在数组里面,通过二分就可以进行快速的查询,但是插入时效率较低,需要将所有的数据往后移动,因此适合静态存储。
    img
  1. 二叉搜索树
    父节点左边的值小于父节点的值,父节点右边的值大于父节点。为了维护查询效率(O(logn)),需要维护树的平衡(O(logn))。
  2. N叉树
    N取决于数据块的大小,能够在较少的磁盘访问的次数下找到数据。

InnoDB索引模型

InnoDB使用B+树索引模型,每一个索引在InnoDB里都对应一个B+树

如下图:

img

根据叶子节点内容的不同,我们可以将索引分为主键索引(聚簇索引)和非主键索引(二级索引)。

基于非主键索引的查询通常需要回表。

基于非主键索引在没有覆盖索引的情况下会先通过非主键索引的B+树找到对应主键,再去主键的B+树中通过主键去查记录,这个过程就称为回表。

索引维护

由于B+树的需要维护索引的有序性,因此在插入和删除记录时,可能会导致页分裂和页合并发生,这会影响数据库性能。因此大多数情况下,建议使用自增主键,除非在表基本不变的情况下(静态表),可以考虑业务值作为主键。

覆盖索引

我们建立的普通索引,通常需要通过回表在主键B+树再次查询才能找到我们需要的字段,但是如果我们建立联合索引,且联合索引的字段中覆盖了我们需要查询的字段,那么我们就称之为覆盖索引。

覆盖索引可以减少树的搜索次数,显著提升性能。

最左前缀原则

索引项在B+树中,是按照索引定义里面出现的字段顺序排序的。

如下图:

img

SQL条件为 where name like '张%'的SQL语句同样满足最左前缀,也可以走索引。

所以最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

索引下推

MySQL5.6引入了索引下推优化,在索引遍历过程中,会对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

img

最后修改:2021 年 09 月 27 日
如果觉得我的文章对你有用,请随意赞赏