MongoDB基础(三)mongodb中的索引使用(二)

2015-07-24 06:48:57 · 作者: · 浏览: 8
})

db.tab.ensureIndex( { "name" :"hashed" })


?

现在查询 id=5000 的行(结果集为1行)

db.tab.find({"id": 5000}).explain()

\

?

查询使用的是id和name的复合索引。

"nscannedObjectsAllPlans" : 2,

"nscannedAllPlans" : 2,

?

现在加上索引提示,强制使用索引:

db.tab.find({"id": 5000}).hint({"id":1}).explain()

\

?

这时使用的是单个键列为id的索引。

"nscannedObjectsAllPlans" : 1,

"nscannedAllPlans" : 1,

?

上面还可以看到,索引有个边界值“indexBounds”

\

?

这个边界值在复合索引查询的时候,会导致扫描更多的数据。这是一个bug :wrong index ranges when using compound index on a list


?

当然我们也可以自己限制边界值。

db.tab.find().min({"id":5000}).max({ "id":5005})

\

?

从上面看,实际只查询这个边界的内的数值。再查看执行计划:

db.tab.find().min({"id":5000}).max({ "id":5005}).explain()

\

?

只是5行数据。如果查询id=5000的,但是索引边界又有问题,这时可以限制边界,如:

db.tab.find({"id": 5000 }).min({"id":5000}).max({ "id":5005})


?

在索引方法中,还有一个方法为cursor.snapshot(),它会确保查询不会多次返回相同的文档,即使是写操作在一个因为文档大小增长而移动的文档。但是,snapshot()不能保证插入或者删除的隔离性。snapshot()是使用在_id键列上的索引,因此snapshot()不能使用sort() 或 hint()。


?

分快照函数析snapshot()的查询结果:

db.tab.find({"id": 5000}).snapshot().explain()

\

?

虽然使用了索引“_id”,但是把整个集合都搜索了!~

?

加索引提示看看,应该是报错的:

db.tab.find({"id": 5000}).snapshot().hint({"id":1})

\

?

果然是出错:snapshot 不能使用提示。


下面总结索引查询的一些方法:

?

Indexing Query Modifiers

db.tab.find({"id": 5000 }).hint({"id":1})

db.tab.find({"id": 5000 })._addSpecial("$hint",{"id":1})

db.tab.find({ $query: {"id": 5000 }, $hint: { "id":1 }})

使用键列id的索引查询id=5000的结果

db.tab.find({"id": 5000 }).snapshot()

db.tab.find({"id": 5000 })._addSpecial( "$snapshot", true )

db.tab.find({ $query: {"id": 5000 }, $snapshot: true })

使用快照的查询id=5000的结果

db.tab.find({"id": 5000 }).hint({"id":1}).explain()

db.tab.find({"id": 5000})._addSpecial("$explain",1)

db.tab.find({ $query: {"id": 5000 }, $hint: { "id":1 }, $explain: 1})

查看执行计划信息

索引边界设置

db.tab.find({"id": 5000 }).max({ "id":5005})

db.tab.find({ $query:{"id": 5000 },$max:{ "id": 5005}})

db.tab.find({"id": 5000 })._addSpecial("$max",{"id": 5005})

?

db.tab.find({"id": 5000 }).min({ "id":5000}).max({ "id":5005}).explain()

db.tab.find({ $query:{"id": 5000 },$max:{ "id": 5005},$min:{ "id": 5000}})

db.tab.find({"id": 5000 })._addSpecial("$min",{"id": 5000})._addSpecial("$max",{"id": 5005})


?

摘取了这了的一个总结:http://www.w3cschool.cc/mongodb/mongodb-indexing.html

?

Parameter

Type

Description

background

Boolean

建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false

unique

Boolean

建立的索引是否唯一。指定为true创建唯一索引。默认值为false.

name

string

索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。

dropDups

Boolean

在建立唯一索引时是否删除重复记录,指定 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.


?