Mongodb Mongo指数不';不能使查询更快
解决了。只需将db.test.ensureIndex(['name'])=>更改为db.test.ensureIndex({'name':1})Mongodb Mongo指数不';不能使查询更快,mongodb,indexing,database-design,database,Mongodb,Indexing,Database Design,Database,解决了。只需将db.test.ensureIndex(['name'])=>更改为db.test.ensureIndex({'name':1}) 今天我在测试MongoDB。我有10万份文档的测试集。每个文档都有这样的结构{u id:123123,名称:'foo123123'} 用PHP编写的测试代码 set_time_limit(0); ini_set('display_errors', 1); $mongo = new Mongo("mongodb://127.0.0.1:27017")
今天我在测试MongoDB。我有10万份文档的测试集。每个文档都有这样的结构{u id:123123,名称:'foo123123'} 用PHP编写的测试代码
set_time_limit(0);
ini_set('display_errors', 1);
$mongo = new Mongo("mongodb://127.0.0.1:27017");
$db = $mongo->test;
$collection = $db->test;
$start = microtime(true);
for($i=0; $i<10000; $i++){
$obj = $collection->findOne(array('name'=>'foo'.$i));
}
$end = microtime(true);
var_dump($end-$start);
设置时间限制(0);
ini设置(“显示错误”,1);
$mongo=新的mongo(“mongodb://127.0.0.1:27017");
$db=$mongo->test;
$collection=$db->test;
$start=microtime(真);
对于($i=0;$ifindOne(数组('name'=>'foo'.$i));
}
$end=微时间(真);
变量转储($end-$start);
在名称字段上没有索引的第一个测试是21秒
然后我添加索引
db.test.ensureIndex(['name'])
db.test.getIndexes();
[
{
“v”:1,
“关键”:{
“_id”:1
},
“ns”:“test.test”,
“名称”:“id”
},
{
“v”:1,
“关键”:[
“姓名”
],
“ns”:“test.test”,
“名称”:“0”
}
]
重复测试。又得到了21个seonds。为什么mongo不在我的案例中使用索引?您应该使用
explain
方法查看执行计划,并确定它是否正确使用索引
我还认为您希望将索引创建命令更新为:
db.things.ensureIndex({“name”:1})
它不是一个数组,而是一个键-值对,其中键是要索引的属性,值是1或-1,这取决于您希望它是升序索引还是降序索引
检查文档中的索引:
对于我的查询,它是{“游标”:“BasicCursor”,“nscanned”:100000,“nscannedObjects”:100000,“n”:1,“millis”:68,“nFields”:0,“nChunkSkips”:0,“isMultiKey”:false,“indexOnly”:false,“indexBounds”:{}那么你是对的,它没有使用索引-如果是的话,它会说游标是B树索引而不是基本游标。我已经用有关索引的更多信息更新了我的答案-请看一看你不知道为什么会这样吗?谢谢!你是对的。我将命令更改为db.things.ensureIndex({“name”:1})现在它正在使用索引