一:索引的常见模型算法

1.哈希表(key-value)存储的数据结构sql

缺点:hash索引在作区间查询时,速度慢。数组

优势:hash索引很适用于等值查询的场景,好比memcached以及其余一些nosql引擎。数据结构

2.有序数组nosql

优势:有序数组在等值查询和范围查询的场景中,性能都很是优秀。memcached

若是仅仅看查询效率,有序数组是最好的数据结构。性能

缺点:更新数据时成本过高。ui

总结:有序数组只适用于静态存储引擎。索引

3.m叉搜索树hash

二:InnoDB的索引模型

每个索引在InnoDB里面,对应一颗B+树。

根据叶子节点的内容,索引分为主键索引和非主键索引。主键索引的叶子节点存储的是整行数据,在innoDB里,主键索引也被称为聚族索引(clustered index)。

非主键索引的叶子节点内容是主键的值。在innoDB里,非主键索引被称为二级索引(secondary index)。

基于主键索引和普通索引的查询,有什么区别?

若是语句是:select * from T where id = 500,主键查询方式,只须要搜索id这颗B+树;

若是语句是:select * from T where k = 5,普通索引查询方式,须要先搜索K索引树,获得id的值为500,再到id索引树搜索一次。这就是回表。

三:索引维护

若是某记录所在的数据页已经满了,根据B+树的算法,这时候须要申请一个新的数据页,而后挪动部分数据过去,这个过程为页分裂。这种状况下,性能会受到影响。

除了性能以外,页分裂还能影响数据页的利用率。本来放在一个页的数据,如今分到两个页中,总体空间利用率下降了50%。

自增主键:自增主键的数据插入模式,正符合了咱们前面提到的递增插入的场景。每次插入一条新纪录,都是追加操做,不涉及挪动其余记录,更不会触发叶子节点的分裂。

除了考虑上面的性能,还能够从存储空间来看。好比表中有个惟一字段,若是咱们是uuid,那么非主键的叶子节点都是主键的值,每一个二级索引的叶子节点占用了36个字节,

但若是用整型看成主键,只须要4个字节,若是长整型,那也只有8个字节。

总结:主键长度越小,普通索引的叶子节点就会越小,普通索引占用的空间也会越小。