索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。本文将详细介绍MongoDB数据库索引
引入
索引能够提高查询效率,如何体现呢?接下来使用性能分析函数explain()来进行分析说明
首先,插入10万条数据
接着,不创建索引,来寻找time范围在100和200之间的文档
由图中所知,totalDocsExamined值为100000,表示查找了100000个文档;nReturned值为101,表示返回了101个文档;executionTimeMillis值为39,表示花费了39ms
下面,我们在time字段上建立索引
再次,寻找time范围在100和200之间的文档
由图可知,totalDocsExamined和nReturned值都是101,executionTimeMillis值为0,相当于从101个文档中,找到了101个文档,查找的速度趋近于0。由此可见,使用索引极大地提升了查询速度
概述
索引是特殊的数据结构,以易于遍历的形式存储数据集的一小部分。 索引存储特定字段或一组字段的值,按照索引中指定的字段值排序
使用索引,可以加快索引相关的查询,也相应地带来一些坏处
1、增加磁盘空间的消耗。在索引比较多的情况下,索引文件所占据的空间有可能超过数据本身
2、在写入数据或更新数据时,对索引的维护一般是写之外的另一条逻辑,一定程度上,会降低写入性能
但是,为了查询的高效,这些影响是值得的。有很多情况下,系统的性能下降,与不合理的索引创建有关。所以,合理的创建索引,可以减少索引带来的不好的影响
索引设置
【getIndexes()】
使用getIndexes()方法来查询索引
db.collection_name.getIndexes()
由下图可知,有"_id"和"time"两个索引
【createIndex()】
db.COLLECTION_NAME.createIndex({KEY:1})
语法中Key值为要创建的索引字段,1为指定按升序创建索引,如果想按降序来创建索引指定为-1即可
当然,也可以创建多个索引字段
db.COLLECTION_NAME.createIndex({k1:1,k2:1})
在MongoDB3.0版本之前,使用的是ensureIndex()方法,现在ensureIndex()方法依然可以使用,只是createIndex()方法的别名
如果文档较多,创建索引需要耗费一定的时间。如果系统负载较重,且有很多已经存在的文档,不能直接使用这个命令进行创建,需要在使用数据库之前,就将索引创建完毕。否则,严重影响数据库的性能
[注意]索引可以重复创建,如果对已经存在的索引再次创建,会直接返回成功
createIndex() 接收可选参数,可选参数列表如下:
Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,默认值为false
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false
name string 索引的名称。如果未指定,MongoDB通过连接索引的字段名和排序顺序生成一个索引名称
dropDups Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 falsesparse Boolean 对文档中不存在的字段数据不启用索引;如果设置为true,索引字段中不会查询出不包含对应字段的文档。默认值为falsev index version 索引的版本号。默认的索引版本取决于mong