索引一般可以极大的提升查询的效率,若是没有索引,MongoDB在读取数据时必须扫描集合中的每一个文件并选取那些符合查询条件的记录。html
这种扫描全集合的查询效率是很是低的,特别在处理大量的数据时,查询能够要花费几十秒甚至几分钟,这对网站的性能是很是致命的。正则表达式
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构mongodb
MongoDB使用CreateIndex() 方法来建立索引数据库
说明:数据结构
语法中 Key值例如x和y,为你要建立的索引字段,1 为指定按升序建立索引,若是你想按降序来建立索引指定为 -1 便可,tse为表名!ide
createIndex() 方法中你也能够设置使用多个字段建立索引(关系型数据库中称做复合索引)。工具
建立单列索引: db.tse.createIndex({x:1},{name:'ix_tsex',background:true}) 建立多列索引: db.tse.createIndex({x:1 ,y:-1},{name:'ix_tse_xy',background:true}) 建立嵌套单列索引: db.tse.insert({x:{y:1}}) db.tse.createIndex({x.y:1},{name:'ix_tse_xy',background:true}) db.tse.find({"x.y":1}) #x.y = 1 建立嵌套子文档单列索引: db.tse.createIndex({tse.uid:1},{name:'ix_tse_tse.uid',background:true}) 建立惟一索引: db.tse.createIndex({x:1 ,y:-1},{name:'uix_tse_xy',background:true,unique:true}) 查看集合中的索引: db.tse.getIndexes() 查看集合索引大小: db.tsel.totalIndexSize() 删除索引: db.tse.dropIndex("ix_tse_xy") #ix_tse_xy是索引名 删除集合全部索引: db.tse.dropIndexes() 检查语句是否使用到索引: db.tse.find({"tse.uid":1}).explain() #tse是表名,tse.uid是嵌套子文档
createIndex() 接收可选参数,可选参数列表以下:性能
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操做,background可指定之后台方式建立索引,即增长 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 创建的索引是否惟一。指定为true建立惟一索引。默认值为false. |
name | string | 索引的名称。若是未指定,MongoDB的经过链接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 3.0+版本已废弃。在创建惟一索引时是否删除重复记录,指定 true 建立惟一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数须要特别注意,若是设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod建立索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其余索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
每一个索引占据必定的存储空间,在进行插入,更新和删除操做时也须要对索引进行操做。因此,若是你不多对集合进行读取操做,建议不使用索引。网站
因为索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。ui
若是索引的大小大于内存的限制,MongoDB会删除一些索引,这将致使性能降低。
索引不能被如下的查询使用:
因此,检测你的语句是否使用索引是一个好的习惯,能够用explain来查看。
检查语句是否使用到索引: db.tse.find({"tse.uid":1}).explain() #tse是表名,tse.uid是嵌套子文档
从2.6版本开始,若是现有的索引字段的值超过索引键的限制,MongoDB中不会建立索引。
若是文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引的集合。与mongorestore和mongoimport工具相似。
参考:菜鸟教程