|
前言
在使用MySQL的过程当中,跟着表数据的逐步增多,为了更快的查问咱们需求的数据,咱们会在表中建设不同类型的索引。
明天咱们来聊一聊,普通索引和独一索引的使用场景,以及为何说保举大家优先使用普通索引,尽可能防止使用独一索引。
关于一个普通的二级索引,目的就是为了减速查问,所以咱们可能会为表中的某个字段或者某些字段,建设一个普通的二级索引。
而关于独一索引来讲,因为其独一键束缚的特性,有时咱们会更多的赋与其业务含意。好比有一张存储身份证号的表,为了包管身份证号的独一性,咱们会在身份证号字段上建设独一索引。
那为何说,不保举大家使用独一索引呢?
接上去,咱们从查问和更新两方面剖析一下独一索引和普通索引的机能差距。
查问机能
咱们知道每个索引其实都是一棵二叉树,所以我简略画了一个索引图,不太美观,大家多多担待。
给大家略微解释一下这张图,不同色彩代表不同的数据页,这里假定一个数据页外面寄放两条数据。
咱们知道MySQL磁盘与内存交互是经过一个叫做数据页的单位,每个数据页默许的大小是16K。
在一棵树上,只要叶子节点才会真实的寄放数据,非叶子节点寄放的是每个上级数据页中最小的索引字段以及指向上级数据页的指针。
关于主键索引,叶子节点寄放的是一行真实的数据,而关于二级索引来讲,在叶子节点存储的是索引字段以及对应的主键id。
好了,上面咱们剖析一下,普通二级索引和独一索引是如何查数据的?
以一个简略的查问sql为例:select id from t where m=103;
1,MySQL从根节点登程,经过二分法判别m=103大于100小于104,所以会找到根节点中100对应的数据页100-102;
2,在100-102的数据页上,因为103大于102,所以会找到102对应的102-103的数据页;
3,在这个数据页上,找到了m=103的记载,并获得到了要查问的id字段。
关于普通的二级索引来讲,找到第一条m=103的记载之后,会持续向后查找,在104-105这个数据页中判别是不是还有合乎m=103前提的记载,假如没有则完结查问。
而关于独一索引来讲,因为其独一性束缚,所以在查找到第一笔记录之后,就完结了查找。
能够看到,两者的差异就在因而否持续查到下一条。
那这二者有多大的机能差距呢?谜底是简直没有。
咱们知道,MySQL的数据是以页为单位寄放的,以一个int类型的二级索引为例,一个int占4个字节,加之MySQL的头信息6个字节,至关于10个字节。
那末一个16k的页上能寄放多少记载呢?
16*1024/10 = 1638。也就是说,一个数据页就可能放下1600多笔记录。那末咱们在查问数据时,会把全部数据页都加载进内存,此时关于普通二级索引判别下一个记载的操作所需的损耗是十分十分小的。
能够说,从查问方面来看,普通二级索引和独一索引的机能根本是至关的。
更新机能
独一索引和普通二级索引的机能差距次要体当初更新操作上。
关于MySQL来讲,更新一条语句的逻辑是首先读到要更新的记载,假如这个记载没有在内存里,就先加载到内存。而后履行更新的语句,之后再把变卦的数据刷新到磁盘中。
然而,关于MySQL来讲,把数据从磁盘读到内存波及到随机IO,是本钱十分高的一种操作。
假如每次更新数据都要这么来一次的话,高机能这个目标恐怕很难包管。
所以,设计MySQL的大神们引入了一个叫做change buffer的货色。
change buffer是一种能够耐久化的缓存数据,当咱们要更新数据时,假如要更新的数据不存在于内存,此时其实不需求把数据从磁盘加载到内存,而是将更新操作记载在change buffer中,更新操作就算实现了。
当下主要读取这些数据时,会把读到的数据和change buffer进行合并,或者叫merge。
经过change buffer,更新操作就不需求去读磁盘了,全程都是内存操作,机能天然能够失掉极大的晋升。
然而!然而问题又来了!
change buffer只对普通二级索引无效,关于独一索引是没无效果的。
为何呢?
由于在更新一笔记录时,咱们需求反省索引的独一性束缚。
如何反省呢?天然首先要把数据从磁盘加载到内存外面能力进行判别。
可是假如都曾经把数据加载到内存里,再去使用change buffer不就显很多此一举了。
所以,独一索引不克不及,也没须要去使用change buffer来晋升机能了。
因为对独一索引的更新波及到读磁盘这个随机IO操作,机能天然也是比不上普通二级索引了,这就是保举大家优先使用普通二级索引的缘故了。
通过比较,大家也能够看到,这两种索引在查问上机能根本是统一的,其机能差距次要体当初更新操作上。
其实即使是大家有一些特殊的业务需求,好比寄放独一的身份证号等,仍是倡议大家经过业务层去束缚。
总的来讲,普通的二级索引比独一索引带来的收益要更大。
我是@顺序员拾山,坚持技术分享,期待与大家一同学习生长,也感激您的点赞和关注。 |
|