索引太多:加快检索速度
在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等,在业务表中只需要建几个关键索引即可。