mysql索引的选择

Posted cr1719

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql索引的选择相关的知识,希望对你有一定的参考价值。

一:索引的常见模型

 

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

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

优点:hash索引很适用于等值查询的场景,比如memcached以及其他一些nosql引擎。

2.有序数组

优点:有序数组在等值查询和范围查询的场景中,性能都非常优秀。

如果仅仅看查询效率,有序数组是最好的数据结构。

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

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

3.m叉搜索树

 

二: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个字节。

 

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

 

以上是关于mysql索引的选择的主要内容,如果未能解决你的问题,请参考以下文章

如何为MySQL查询优化选择最佳索引

MySQL 索引优化器选择索引的规则是啥?

mysql索引之前缀索引

五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》

Day874.MySQL索引选择出错问题 -MySQL实战

Day874.MySQL索引选择出错问题 -MySQL实战