有序字典(python)对w.r.t复合索引有影响吗?

时间:2014-09-19 23:52:24

标签: mongodb pymongo

在复合指数中排序很重要。但读/写的顺序是否重要? mongodb足够聪明,可以根据可用的索引重新排序字段吗?

代码在python中。我读到最好使用:http://api.mongodb.org/python/current/api/bson/son.html传递有序词典。

但是在有序和无序字典之间切换之后,我认为没有任何性能差异。对任一选项运行说明,表明它评估了不同的索引(allPlans字段)并且确实选择了其订单与接收查询的方式不同的索引。

如果能够以任何方式证实这一点,我会很高兴。

我正在使用mongo 2.6。可能是mongo在他们的新版本中添加了某种优化。

编辑:(添加示例) 例如:

Index is on {c: 1, a: 1, b: 1}
Intended query: db.tble.find(some_dict)

哪一个更好? (在python中)

  1. some_dict = {c:“C”,a:“A”,b:“B”} #noordered。
  2. some_dict = bson.son.SON({c:“C”,a:“A”,b:“B”})
  3. 两者都没有任何区别,但建议使用2nd,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

您在查询中指定字段的顺序,例如

db.collection.find({ "a" : 2, "b" : 4})

VS

db.collection.find({ "b" : 2, "a" : 4})

没关系,因为两个查询之间没有语义差异。在指定复合索引时,字段的顺序很重要,例如

db.collection.ensureIndex({ "a" : 1, "b" : 1})

VS

db.collection.ensureIndex({ "b" : 1, "a" : 1})

因为复合索引只能用于满足有序索引键前缀的查询。这意味着{ "a" : 1, "b" : 1}上的前一个索引可以满足查询

db.collection.find({ "a" : 33})

{ "b" : 1, "a" : 1}上的后一个索引不能。有关更多说明和示例,请参阅compound index docs