MongoDB 索引

索引支持的解析度的查询效率。如果没有索引,MongoDB 必须扫描每一个文档的集合,要选择那些文档相匹配的查询语句。这种扫描的效率非常低,会要求 mongod 做大数据量的处理。

索引是一种特殊的数据结构,存储设置在一个易于遍历形式的数据的一小部分。索引存储一个特定的字段或一组字段的值,在索引中指定的值的字段排列的。

ensureIndex() 方法

要创建一个索引,需要使用MongoDB 的ensureIndex()方法。

语法:

ensureIndex() 方法的基本语法如下

>db.COLLECTION_NAME.ensureIndex({KEY:1})
这里关键是要在其中创建索引,1是按升序排列的字段名称。要创建降序索引,需要使用-1。

例子

>db.mycol.ensureIndex({"title":1})
在ensureIndex()方法,可以通过多个字段多个字段上创建索引。

>db.mycol.ensureIndex({"title":1,"description":-1})
ensureIndex() 方法也可以接受的选项列表(可选),其下面给出的列表:


参数类型描述
backgroundBoolean在后台建立索引,以便建立索引并不能阻止其他数据库活动。指定true建立在后台。默认值是 false.
uniqueBoolean创建唯一索引,以便收集不会接受插入索引键或键匹配现有的值存储在索引文档。指定创建唯一索引。默认值是 false.
namestring索引的名称。如果未指定,MongoDB中都生成一个索引名索引字段的名称和排序顺序串联.
dropDupsBoolean创建一个唯一索引的字段,可能有重复。 MongoDB的索引只有第一次出现的一个键,从集合中删除的所有文件包含该键的后续出现的。指定创建唯一索引。默认值是 false.
sparseBoolean如果为true,指数只引用文档指定的字段。这些索引使用更少的空间,但在某些情况下,特别是各种不同的表现。默认值是 false.
expireAfterSecondsinteger指定一个值,以秒为TTL控制多久MongoDB的文档保留在此集合.
vindex version索引版本号。默认的索引版本取决于mongodb 运行的版本在创建索引时.
weightsdocument权重是从1到99999范围内的数,表示该字段的意义,相对于其他的索引字段分数.
default_languagestring对于文本索引时,决定停止词和词干分析器和标记生成规则列表的语言。默认值是 english.
language_overridestring对于文本索引时,指定的名称在文档中包含覆盖默认的语言,语言字段中。默认值是语言。

索引创建

 

1:索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引

2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序

3. 默认是用btree来组织索引文件,2.4版本以后,也允许建立hash索引.

 

查看查询计划

db.find(query).explain();

"cursor": "BasicCursor", ----说明没有索引发挥作用

"nscannedObjects": 1000 ---理论上要扫描多少行

cursor" :"BtreeCursor sn_1", 用到的btree索引

 

 

常用命令:

查看当前索引状态: db.collection.getIndexes();

 

创建普通的单列索引:db.collection.ensureIndex({field:1/-1});  1是升续 2是降续

 

删除单个索引

db.collection.dropIndex({filed:1/-1});

 

一下删除所有索引

db.collection.dropIndexes();

 

创建多列索引 db.collection.ensureIndex({field1:1/-1, field2:1/-1});

 

创建子文档索引

db.collection.ensureIndex({filed.subfield:1/-1});

 

 

创建唯一索引:

db.collection.ensureIndex({filed.subfield:1/-1},{unique:true});

 

创建稀疏索引:

稀疏索引的特点------如果针对field做索引,针对不含field列的文档,将不建立索引.

与之相对,普通索引,会把该文档的field列的值认为NULL,并建索引.

适宜于: 小部分文档含有某列时.

db.collection.ensureIndex({field:1/-1},{sparse:true});

 

>db.tea.find();

{"_id" : ObjectId("5275f99b87437c610023597b"),"email" : "a@163.com" }

{"_id" : ObjectId("5275f99e87437c610023597c"),"email" : "b@163.com" }

{"_id" : ObjectId("5275f9e887437c610023597e"),"email" : "c@163.com" }

{"_id" : ObjectId("5275fa3887437c6100235980") }

如上内容,最后一行没有email列,

如果分别加普通索引,和稀疏索引,

对于最后一行的email分别当成null 和 忽略最后一行来处理.

根据{email:null}来查询,前者能查到,而稀疏索引查不到最后一行.

 

 

创建哈希索引(2.4新增的)

哈希索引速度比普通索引快,但是,无能对范围查询进行优化.

适宜于---随机性强的散列

db.collection.ensureIndex({file:’hashed’});

 

重建索引

一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此.

可以通过索引的重建,减少索引文件碎片,并提高索引的效率.

类似mysql中的optimizetable

 

db.collection.reIndex()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值