您的位置:首页 > 数据库 > Mongodb

mongodb建索引的策略

2016-10-21 09:44 190 查看

该如何建立有效索引

现在有这么一个查询条件,数据库里的数据总量是60087条数据:

db.t_f10_company_executives_01.find({symbol:"000002",status:1}).sort({fce1_03:-1})


如果不建立索引的话,需要1.6s左右时间。

后来我建立如下索引:


db.t_f10_company_executives_01.ensureIndex({fce1_03:-1,symbol:1,status:1});


那它走了那个索引呢?执行下面语句

db.t_f10_company_executives_01.find({symbol:"000002",status:1}).sort({fce1_03:-1}).explain()


结果是(执行时间是0.078s):


{
"cursor" : "BtreeCursor fce1_03_-1_symbol_1_status_1",
"isMultiKey" : false,
"n" : 25,
"nscannedObjects" : 25,
"nscanned" : 4044,
"nscannedObjectsAllPlans" : 4067,
"nscannedAllPlans" : 8086,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 10,
"nChunkSkips" : 0,
"millis" : 22,
"indexBounds" : {
"fce1_03" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
],
"symbol" : [
[
"000002",
"000002"
]
],
"status" : [
[
1,
1
]
]
},
"server" : "10-10-120-241:27018",
"millis" : 22
}


我们肯定希望nscanned的值接近n的值才是最理想的。

于是把刚刚建立的索引删除:
`db.t_f10_company_executives_01.dropIndex("fce1_03_-1_symbol_1_status_1")`
我们现在把symbol与fce1_03字段调整下顺序:
`db.t_f10_company_executives_01.ensureIndex({fce1_03:-1,symbol:1,status:1});`
再次执行,效果是:


db.t_f10_company_executives_01.find({symbol:"000002",status:1}).sort({fce1_03:-1}).explain()


{
"cursor" : "BtreeCursor symbol_1_status_1_fce1_03_-1",
"isMultiKey" : false,
"n" : 25,
"nscannedObjects" : 25,
"nscanned" : 25,
"nscannedObjectsAllPlans" : 25,
"nscannedAllPlans" : 25,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"symbol" : [
[
"000002",
"000002"
]
],
"status" : [
[
1,
1
]
],
"fce1_03" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "10-10-120-241:27018",
"millis" : 0
}


个人总结:建立索引时,过滤字段放到前面,排序字段建议放到后面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: