索引的缺点(2):创建索引有开销
2018-01-22 15:42
134 查看
索引的一个缺点是 创建索引有开销。
下面从创建索引的过程、对DML语句的影响两方面进行说明。
(1)创建索引的过程
创建索引,就是把表里的数据从磁盘读到内存,在内存中排序,在内存中构造B树的根、分支、叶子节点,最后写回到磁盘上。
从这个过程来看,主要的开销是消耗一定的内存,还有消耗cpu来排序操作。
当索引创建一定时间后,索引中会有很多碎片,这个时候,要对索引进行整理、重建等操作,也会有类似创建过程中的开销。
(2)索引对增删改操作的影响
在创建索引过程中,如果不断对表的数据进行增删改,会不会导致创建索引的过程,停不下来?
以前,我也有这个疑惑,后来看了相关文档、书籍,才知道创建索引的过程中,会对表加上只读锁。
也就是说,如果这个时候有DML操作,由于这个只读锁的存在,会阻塞住DML语句,直到整个索引创建完后,才能继续下去。
所以,一般创建索引的操作,建议在晚上数据库维护期间进行,特别是表中数据很大的时候,创建索引时会消耗大量内存、cpu。
一是,会阻塞,建索引的表 涉及到的业务操作。
另一方面,会导致服务器负载过高,影响其其他业务模块,使得响应时间变长,本来一个操作只要0.5秒的,现在可能要5秒。
下面从创建索引的过程、对DML语句的影响两方面进行说明。
(1)创建索引的过程
创建索引,就是把表里的数据从磁盘读到内存,在内存中排序,在内存中构造B树的根、分支、叶子节点,最后写回到磁盘上。
从这个过程来看,主要的开销是消耗一定的内存,还有消耗cpu来排序操作。
当索引创建一定时间后,索引中会有很多碎片,这个时候,要对索引进行整理、重建等操作,也会有类似创建过程中的开销。
(2)索引对增删改操作的影响
在创建索引过程中,如果不断对表的数据进行增删改,会不会导致创建索引的过程,停不下来?
以前,我也有这个疑惑,后来看了相关文档、书籍,才知道创建索引的过程中,会对表加上只读锁。
也就是说,如果这个时候有DML操作,由于这个只读锁的存在,会阻塞住DML语句,直到整个索引创建完后,才能继续下去。
所以,一般创建索引的操作,建议在晚上数据库维护期间进行,特别是表中数据很大的时候,创建索引时会消耗大量内存、cpu。
一是,会阻塞,建索引的表 涉及到的业务操作。
另一方面,会导致服务器负载过高,影响其其他业务模块,使得响应时间变长,本来一个操作只要0.5秒的,现在可能要5秒。
相关文章推荐
- 数据库创建索引有什么优点和缺点
- 数据库创建索引有什么优点和缺点
- 创建索引有哪些缺点?有哪些负面的影响?
- 数据库创建索引有什么优点和缺点
- 创建索引的优点和缺点
- 数据库创建索引有什么优点和缺点
- 数据库创建索引有什么优点和缺点
- Mongodb在查询某个字段是否存在,执行删除字段,python中排序和创建索引
- 使用事务保证数据完整性和创建和使用索引
- 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
- 高性能MySQL(二):创建高性能索引
- lucene索引管理(索引创建于删除)
- MySQL索引的创建、删除和查看
- Lucene的学习第五篇——创建索引—域的再学习
- SQLServer索引调优实践(3)-SQL Server创建索引
- oracle下快速创建索引
- MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项
- Postgresql客户端创建GIN索引问题
- HTML5 indexedDB数据库二之创建索引
- Lucene 根据数据库创建索引关键代码