Mongodb Mongo指数不';不能使查询更快

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")

解决了。只需将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");
$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})现在它正在使用索引