索引的一个缺点是 创建索引有开销。
下面从创建索引的过程、对DML语句的影响两方面进行说明。
(1)创建索引的过程
创建索引,就是把表里的数据从磁盘读到内存,在内存中排序,在内存中构造B树的根、分支、叶子节点,最后写回到磁盘上。
从这个过程来看,主要的开销是消耗一定的内存,还有消耗cpu来排序操作。
当索引创建一定时间后,索引中会有很多碎片,这个时候,要对索引进行整理、重建等操作,也会有类似创建过程中的开销。
(2)索引对增删改操作的影响
在创建索引过程中,如果不断对表的数据进行增删改,会不会导致创建索引的过程,停不下来?
以前,我也有这个疑惑,后来看了相关文档、书籍,才知道创建索引的过程中,会对表加上只读锁。
也就是说,如果这个时候有DML操作,由于这个只读锁的存在,会阻塞住DML语句,直到整个索引创建完后,才能继续下去。
所以,一般创建索引的操作,建议在晚上数据库维护期间进行,特别是表中数据很大的时候,创建索引时会消耗大量内存、cpu。
一是,会阻塞,建索引的表 涉及到的业务操作。
另一方面,会导致服务器负载过高,影响其其他业务模块,使得响应时间变长,本来一个操作只要0.5秒的,现在可能要5秒。