2011-11-09 67 views
0

已解决。只需将db.test.ensureIndex(['name'])=>更改为db.test.ensureIndex({'name':1});Mongo索引不会使查询更快


我今天正在测试MongoDB。我有100 000个文件的测试收集。每个文档都有这样的结构{_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(['name']);

db.test.getIndexes(); [ { “V”:1, “键”:{ “_id”:1 }, “NS”: “test.test”, “名称”: “ID” } { “v”:1, “键”:[ “姓名” ], “NS”: “test.test”, “名称”: “0_” } ]

并重复测试。又获得了21个seonds。为什么mongo在我的情况下不使用索引?

回答

1

您应该使用explain方法来查看执行计划并找出它是否正确使用索引。

http://www.mongodb.org/display/DOCS/Explain

我也认为你需要更新索引创建命令是:

db.things.ensureIndex({ “名”:1})

这是不一个数组,而是一个键 - 值对,其中键是您要索引的属性,值取值为1或-1,具体取决于您希望索引是升序还是降序。

检查文档指数: http://www.mongodb.org/display/DOCS/Indexes#Indexes-CreationOptions

+0

对于我的查询是 { “光标”: “BasicCursor”, “nscanned”:100000, “nscannedObjects”:100000, “N” :1, “米利斯”:68, “nYields”:0, “nChunkSkips”:0, “isMultiKey”:假, “indexOnly”:假, “indexBounds”:{ } } – zim32

+0

所以,如果它没有使用索引是正确的 - 如果是,它会说光标是B-Tree索引而不是基本光标。 –

+0

我已经更新了我的答案,提供了有关索引的更多信息 - 请看看 –