一、关于foreground/background index build
在4.2以前,MongoDB创建索引有两种方式,一种是foreground,前台创建,一种是background,后台创建。
默认情况下是使用foreground的方式创建索引,这种方式会对表所属的数据库持有一个排它锁,所有对该库的读写都会被堵,例如listDatabases需要对所有库的读锁,执行这个操作会被堵塞。
可以通过在创建时指定background:true来选择后台创建方式,例如db.test.createIndex( { name: 1 }, { background: true } )。
后台创建方式是运行在后台,不会对其他会话的读写操作造成堵塞,但是相应的索引创建速度也会更慢。需要注意的是,创建索引的会话也是会被堵塞至索引创建成功,而不是发出命令之后就能返回继续操作。
无论是前台还是后台的方式,创建索引都会产生一定的性能负载,还是尽可能安排在空闲窗口去操作。
4.2版本的新特性
从4.2开始,创建索引不再有前台和后台的区别,即使在命令里指定background:true也不会有用。
而是采用新的创建方式:只在索引创建起始和结束阶段持有表的排它锁;在创建中间过程是持有意向锁,在此期间不堵塞表的读写操作。
二、创建索引与使用内存
创建索引需要用到内存,默认使用内存的上线是500M,如果超过500M的限制,就会用到临时磁盘文件,具体是在dbpath下新建一个名为_tmp的子目录。创建索引使用的内存限制可以通过参数maxIndexBuildMemoryUsageMegabytes来设置。
三、复制集和分片集的轮流索引创建方式
复制集和分片集由于存在集群关系和主从复制的特点