本篇主要介绍Mysql当中非常重要的一个知识点---索引,该篇目录如下

  • 常见索引数据结构
  • InnoDB存储引擎索引采用B+树
  • InnoDB主键索引与普通索引的区别

下面开始分别介绍,首先介绍三种常见的索引数据结构。包括Hash索引,有序数组索引,平衡二叉树索引。

常见索引数据结构:

Hash索引是利用一个Hash函数,它本身也是一个数组,然后利用hash函数将数据库中不同的值映射到数组中。因为通过hash函数进行计算可能存在不同的值对应数组同一位置,这时候Hash索引就可以采用链表的形式进行存储。如果需要查找时,遍历链表即可。

优点:如果Hash冲突不严重,查找性能还是挺高的,时间复杂度O(1)

缺点:因为数据存储是无序的,不支持范围查询,只支持等值查询

采用有序数组的索引,数据存储在其中是有顺序的。采用的也是数组进行数据保存

优点:因为有序,所以支持范围查询

缺点:为了维护有序,插入数据时,可能需要挪到数组中的值,造成开销较大。

平衡二叉树索引结构,采用二叉树的来保存数据,几叉数就表示每个节点下面有多少子节点。比如根节点下面分别有两个子节点,这两个子节点下面有分别又有两个子节点。节点存储在磁盘,这样如果树的高度比较高的话,进行数据查找,磁盘寻址次数会比较多,假如一次磁盘寻址是100ms,2次寻址查询就要耗时200ms,会非常慢。

后来拓展了N叉数,就是节点下面存储的子节点包含N个,这样可以很大程度的减少书的高度,减少磁盘I/O,寻址的次数。

优点:每个左子节点的数值 < 父节点 < 右子节点。保障了有序性,支持范围查询。

缺点:为了维护这种平衡性需要进行树结构的调整,会有性能影响

InnoDB存储引擎使用B+树:

innoDB存储引擎的索引采用B+树,每个索引代表的是一棵B+树。B+树的叶子节点上存储的是数据页,1页里面可能包含多行的数据(1页大概16k)。也就是说叶子节点上面包含的是每一行的数据,找到叶子节点也就找到行数据。

InnoDB主键索引与普通索引的区别:

InnoDB存储引擎的主键索引叶子节点:存储的是数据页

innoDB存储引擎普通索引叶子节点:存储的是主键索引

进行数据查找时,如果根据主键值查询数据时,直接定位到叶子节点即可查询结果(这种情况也叫聚簇索引)。如果根据普通索引进行数据查询,则先找到主键索引,再回表查询主键索引叶子节点存储的数据行(非聚簇索引)

索引就又引申出了,关于主键索引的选择是,如果选择递增id的话,数据存储也是有序的,普通索引占据的空间大小更小。插入性能比较客观。如果选择类似于业务字段值做主键,将会造成普通索引占据更大的内存空间。

但是也有使用业务字段做主键的。
只有一个索引

该索引必须是唯一索引