从change buffer分析MySQL唯一索引与普通索引的选择

前言

不知道你有没有遇到过,把一个原本为普通索引的列改为唯一索引,反而造成了系统阻塞,按照常规理解,唯一索引应该是要比普通索引更高效的才对,不过实际上也是要分场景的,本文就结合change buffer来分析下唯一索引与普通索引究竟有什么区别。

为什么会有change buffer

如果没有change buffer,那么当我们写数据时就需要先从磁盘加载数据页到缓冲池,然后再对数据页进行修改。
而有了change buffer的存在后,就不需要先从磁盘加载数据页,而是可以直接把数据写到change buffer中,当之后有读取当前数据的时候,再以批的方式把change buffer中的内容合并到缓冲池中。这样看来每次写入时就能节省一次磁盘IO的随机读取,这是非常有效的提升方式。

change buffer对唯一索引与普通索引的写入影响

对于唯一索引来说,由于唯一性的约束,就要求在更新操作时必须保证数据唯一,所以磁盘读取IO则无法避免,那自然没有必要再多一次change buffer。

而对于普通索引来说,则没有唯一性的要求,因此还是可以直接写change buffer的。

所以如果是唯一索引就无法使用change buffer带来的利好。

唯一索引与普通索引的读取差别

对于唯一索引来说,读操作是他的优势,因为唯一索引一旦读取到匹配的内容就可以停止检索了,而普通索引则必须多遍历一次下一条的记录(如果数据刚好是页文件的最后一条,那就还需要多读取下一数据页,但是这种情况概率并不高)。

唯一索引与普通索引综合比较

从前面读取和写入的分析来看,如果是写多读少的场景那么普通索引是比较有优势的,而如果是读多写少的场景则更应该选择唯一索引。

阿里开发手册上的规定

在这里插入图片描述
我觉得阿里的开发手册还是为了兼顾大多数的业务场景而规定的,并且更侧重于利用唯一索引来控制业务上唯一性的需求,强调了业务上具有唯一性的字段必须要使用唯一索引,并且阿里的电商场景大多数也是读多写少的。

总结

无论是普通索引还是唯一索引,只要你能认识到两者在不同场景下的区别,再结合自身的业务场景,那么就一定能做出正确的选择。

Guess you like

Origin blog.csdn.net/CSDN_WYL2016/article/details/120040915