我是靠谱客的博主 花痴御姐,最近开发中收集的这篇文章主要介绍MYSQL 普通索引和唯一索引查询和修改执行过程,性能和选择对比,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

普通索引一般用来提高查询速度。

唯一索引除了可以提高查询速度,还能做到列属性唯一,可以用作幂等性保证,唯一性约束等。

查询过程

如果是普通索引,查询到指定结果后肯定要继续查,知道查找到第一个不满足条件的财汇停止

如果是唯一索引,查到第一个满足的就不会继续查的。

当然,因为InnoDB是按照页(大概16KB,一个数据页可以放几千个索引值)为单位读写取数据,所以这个概率和成本差距非常小。

修改过程

修改过程分为两种情况。

第一种情况是,如果数据页在内存中,就可以直接更新;如果数据页不在内存中,InnoDB会把更新操作缓存在 change buffer(是可以持久化到磁盘中的)。

所以修改本身实际上是不需要从磁盘读取数据的。下次再查询到这个数据页的数据,可以将数据页读进内存,先执行change buffer中与这个数据页相关的操作,再返回数据;另外db系统后台也会定期刷change buffer到数据页。

change buffer 中的操作应用到数据页的过程就叫 merge。

显然,有了change buffer的存在可以减少磁盘IO,减少查询数据到buffer pool ,提高磁盘利用效率

 上面的过程显然只有普通索引能能够正常进行,如果是唯一索引,可以说根本用不了change buffer。

因为如果是唯一索引,每次修改操作都要把数据页本身加载到内存中,如果数据页本身就在内存中唯一索引会增加CPU执行判断运算,性能差距不大。

但是如果修改的数据存储的数据页不在内存中,唯一索引必须把数据页先加载到内存中,再进行判断,再修改change buffer;普通索引可能根本不需要加载数据,只要把更新记录保存到change buffer就可以了。

小建议

写多读少的场景,change buffer使用效果会很好;

如果是更新后会马上查询,可能发挥不了change buffer的作用了。

innodb_change_buffer_max_size 参数可以配置 change buffer 占用 buffer pool 的比例(50代表最多50%)。

在业务不需要的时候,大量增删改场景下,如果使用唯一索引会导致数据库的内存命中率降低。

redo log 主要节省的是将随机写磁盘的 IO 消耗转成顺序写,而 change buffer 主要节省的则是随机读磁盘的 IO 消耗次数。

最后

以上就是花痴御姐为你收集整理的MYSQL 普通索引和唯一索引查询和修改执行过程,性能和选择对比的全部内容,希望文章能够帮你解决MYSQL 普通索引和唯一索引查询和修改执行过程,性能和选择对比所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部