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. |
?