解决。只需更改db.test.ensureIndex(['name'])=>到db.test.ensureIndex({'name':1});
我今天正在测试MongoDB。我有10万份文件的测试集。每个文档都有这样的结构{_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);
名称字段上没有索引的第一个测试是21秒 比我添加索引
db.test.ensureIndex([ '名称']);
db.test.getIndexes(); [ { “v”:1, “关键”:{ “_id”:1 }, “ns”:“test.test”, “name”:“ id ” }, { “v”:1, “关键”:[ “名称” ] “ns”:“test.test”, “名字”:“0_” } ]
重复测试。并再次获得21个seonds。为什么mongo在我的情况下不使用索引?
答案 0 :(得分:1)
您应该使用explain
方法查看执行计划并找出它是否正确使用索引。
http://www.mongodb.org/display/DOCS/Explain
我还认为您要将索引创建命令更新为:
db.things.ensureIndex({“name”:1})
它不是一个数组,而是一个键值对,其中键是要索引的属性,值为1或-1,具体取决于您是希望将其索引为升序还是降序。
检查索引的文档: http://www.mongodb.org/display/DOCS/Indexes#Indexes-CreationOptions