MYSQL 普通索引和唯一索引查询和修改执行过程,性能和选择对比

11 篇文章 0 订阅
10 篇文章 0 订阅

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

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

查询过程

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

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

当然,因为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 消耗次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值