前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。本文将详细介绍Mon ...
前面的话
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。本文将详细介绍MongoDB数据库索引
引入
索引能够提高查询效率,如何体现呢?接下来使用性能分析函数explain()来进行分析说明
首先,插入10万条数据
由图中所知,totalDocsExamined值为100000,表示查找了100000个文档;nReturned值为101,表示返回了101个文档;executionTimeMillis值为39,表示花费了39ms
下面,我们在time字段上建立索引
由图可知,totalDocsExamined和nReturned值都是101,executionTimeMillis值为0,相当于从101个文档中,找到了101个文档,查找的速度趋近于0。由此可见,使用索引极大地提升了查询速度
概述
索引是特殊的数据结构,以易于遍历的形式存储数据集的一小部分。 索引存储特定字段或一组字段的值,按照索引中指定的字段值排序
使用索引,可以加快索引相关的查询,也相应地带来一些坏处
1、增加磁盘空间的消耗。在索引比较多的情况下,索引文件所占据的空间有可能超过数据本身
2、在写入数据或更新数据时,对索引的维护一般是写之外的另一条逻辑,一定程度上,会降低写入性能
但是,为了查询的高效,这些影响是值得的。有很多情况下,系统的性能下降,与不合理的索引创建有关。所以,合理的创建索引,可以减少索引带来的不好的影响
索引设置
【getIndexes()】
使用getIndexes()方法来查询索引
db.collection_name.getIndexes()
【createIndex()】
db.COLLECTION_NAME.createIndex({KEY:1})
createIndex() 接收可选参数,可选参数列表如下:
Parameter Type Descriptionbackground Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,默认值为falseunique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为falsename string 索引的名称。如果未指定,MongoDB通过连接索引的字段名和排序顺序生成一个索引名称dropDups Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 falsesparse Boolean 对文档中不存在的字段数据不启用索引;如果设置为true,索引字段中不会查询出不包含对应字段的文档。默认值为falsev index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语language_override string 对于文本索引,该参数指定了包含在文档中的字段名,默认值为language
[注意]_id索引无法被删除
【dropIndexes()】
使用db.collection_name.dropIndexes()方法可以删除所有索引
db.collection_name.dropIndexes()
索引属性
【TTL】
过期索引又称为TTL索引,是一种特殊类型的单字段索引,主要用于当满足某个特定时间之后自动删除相应的文档。也就是说集合中的文档有一定的有效期,超过有效期的文档就会失效,会被移除。也即是数据会过期。过期的数据无需保留,这种情形适用于如机器生成的事件数据,日志和会话信息等等
同样地,过期索引使用createIndex()方法来创建,但它支持第二个参数expireAfterSeconds,用来指定多少秒过期或者包含过期日期值的数组
db.eventlog.createIndex( { x: 1 }, { expireAfterSeconds: 3600 } )
使用过期索引,有以下几点注意事项
1、存储在过期索引字段的值必须是指定的时间类型。必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除
以下示例中time设置了ISODate类型的值,该值到60s后会被自动删除
2、如果指定了ISODate时间数组,则按照最小的时间进行删除
3、过期索引不能是复合索引
4、删除时间是不精确的。删除过程是由后台程序每60s跑一次,而且删除也需要一些时间,存在误差。所以,如果设置的到期时间与当前时间的间隔小于60s,则文档最少也要60s才能被删除
【唯一性】
索引的属性可以具有唯一性,即唯一索引,只要设置索引属性中的unique为true即可,默认为false。唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性。缺省情况下,mongodb的_id字段在创建集合的时候会自动创建一个唯一索引
db.collection_name.createIndex({},{unique:true})
在设置unique:true后,不能插入重复的值
【稀疏性】
索引的属性可以具有稀疏性,即稀疏索引,只要设置索引属性中的sparse为true即可,默认为false
db.collection_name.createIndex({},{sparse:true})
由下图所示,创建了{m:1}的稀疏索引,使用find()方法查找不存在m字段的文档时,结果出现了。是因为,MongoDB并没有使用稀疏索引来查询
如果使用hint()方法强制使用稀疏索引来查找索引上存在而文档中不存在的字段,则没有结果。再次说明稀疏索引不能用来查找索引上存在,但文档里不存在的字段
【单键索引】
单键索引是最普通的索引,与_id索引不同,单键索引不会自动创建
比如,一条记录,形式为{x:1,y:2,z:3},在x字段上建立索引,之后就可以使用x为条件进行查询
下面来搜索'huochai',可搜索到3条记录
如果搜索'a1 a2 a3',则相当于或的关系,a1 或 a2 或 a3,可以搜索到3条记录
如果要搜索且关系,比如同时包含huochai和css的记录,则需要在内部添加引号," \"huochai\" \"css\" "
[注意]只支持双引号
然后开始搜索'huochai',并带有相似度
【限制】
1、每次查询,只能指定一个$text查询
2、$text查询不能出现在$nor查询中
3、查询中如果包含了$text,hint()将不再起作用
4、只能对整个单词查询,不能对单词的截取部分查询。类似地,中**全文查询的时候,只能查询一段话中有空格的该字或者词
原标题:MongoDB数据库索引
关键词:MongoDB
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。