【问题标题】:Mongo index doesn't make query fasterMongo 索引不会使查询更快
【发布时间】:2011-12-25 13:41:55
【问题描述】:

解决了。只需将 db.test.ensureIndex(['name']) => 更改为 db.test.ensureIndex({'name':1});


我今天正在测试 MongoDB。我有 100 000 个文档的测试集合。每个文档都有这样的结构 {_id:123123, name: '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 秒。为什么 mongo 在我的情况下不使用索引?

【问题讨论】:

    标签: mongodb indexing database-design database


    【解决方案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

    【讨论】:

    • 对于我的查询,它是 { "cursor" : "BasicCursor", "nscanned" : 100000, "nscannedObjects" : 100000, "n" : 1, "millis" : 68, "nYields" : 0,“nChunkSkips”:0,“isMultiKey”:假,“indexOnly”:假,“indexBounds”:{}}
    • 那么你是正确的,它没有使用索引 - 如果是,它会说光标是 B-Tree 索引而不是基本光标。
    • 我已经用有关索引的更多信息更新了我的答案 - 请看一下
    • 你不知道为什么会这样吗?
    • 谢谢!你说的对。我将命令更改为 db.things.ensureIndex({"name": 1}) 现在它正在使用索引
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多