概述
普通索引一般用来提高查询速度。
唯一索引除了可以提高查询速度,还能做到列属性唯一,可以用作幂等性保证,唯一性约束等。
查询过程
如果是普通索引,查询到指定结果后肯定要继续查,知道查找到第一个不满足条件的财汇停止
如果是唯一索引,查到第一个满足的就不会继续查的。
当然,因为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 普通索引和唯一索引查询和修改执行过程,性能和选择对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复