42.索引对读写的影响

索引太多:加快检索速度

在MySQL的表里建立一些字段对应的索引,好处是什么?

好处是可以直接根据某个字段的索引B+树来查找数据,不需要全表搜索,性能提升是很高的。

但是物极必反。

索引过多一定情况下会导致索引文件过大(指数增长),系统在寻址时查询时间增长。

一本书光目录就占半本书,目录(索引)就没有意义了。

索引太多:占用磁盘空间

索引当然有缺点了,主要是两个缺点,一个是空间上的,一个是时间上的。

空间上而言,你要是给很多字段创建很多的索引,那你必须会有很多棵索引B+树,每一棵B+树都要占用很多的磁盘空间啊!

所以你要是搞的索引太多了,是很耗费磁盘空间的。

索引太多:增删改太慢

其次,当在表中插入、更新或删除数据时,数据库需要维护索引的更新,维护开销就会变得非常大,导致写入操作变慢。

你要是搞了很多索引,那么你在进行增删改查的时候,每次都需要维护各个索引的数据有序性,因为每个索引B+树都要求页内是按照值大小排序的,页之间也是有序的,下一个页的所有值必须大于上一个页的所有值!

所以你不停的增删改查,必然会导致各个数据页之间的值大小可能会没有顺序,比如下一个数据页里插入了一个比较小的值,居然比上一个数据页的值要小!此时就没办法了,只能进行数据页的挪动,维护页之间的顺序。

或者是你不停的插入数据,各个索引的数据页就要不停的分裂,不停的增加新的索引页,这个过程都是耗费时间的。

所以你要是一个表里搞的索引太多了,很可能就会导致你的增删改的速度就比较差了,也许查询速度确实是可以提高,但是增删改就会受到影响,因此通常来说,我们是不建议一个表里搞的索引太多的!

我们的目标是尽量用最少的索引满足最多的查询请求,还不至于让索引占用太多磁盘空间,影响增删改性能。

参考:https://blog.csdn.net/zht245648124/article/details/129290860

索引太多:锁等待和死锁:并发度降低

在进行查询操作时,数据库会对相关的数据进行锁定,以保证数据的一致性。但是索引过多会导致锁竞争,因为每个索引都需要进行锁定,从而导致锁的竞争变得激烈,影响数据库的性能。

索引对写请求的影响

那索引的存在对写入请求影响到底有多大? 也就是说,索引的数量多少与写请求效率的降低有没有一个对应的关系?

https://zhuanlan.zhihu.com/p/387475772

结论:索引数量不是越多越好

建议索引的数量控制在5个以内。

mysql使用的B+树的结构来保存索引的,在insert、update和delete操作时,需要更新B+树索引。如果索引过多,会消耗很多额外的性能。

那么,问题来了,如果表中的索引太多,超过了5个该怎么办?

这个问题要辩证的看,如果你的系统并发量不高,表中的数据量也不多,其实超过5个也可以,只要不要超过太多就行。

但对于一些高并发的系统,请务必遵守单表索引数量不要超过5的限制。

那么,高并发系统如何优化索引数量?

能够建联合索引,就别建单个索引,可以删除无用的单个索引。

将部分查询功能迁移到其他类型的数据库中,比如:Elastic Seach、HBase等,在业务表中只需要建几个关键索引即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值