一:索引的常见模型算法
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个字节。
总结:主键长度越小,普通索引的叶子节点就会越小,普通索引占用的空间也会越小。