【问题标题】:Does ordered dictionary (python) matter w.r.t compound indexes?有序字典(python)是否与复合索引有关?
【发布时间】:2014-09-22 23:07:20
【问题描述】:

复合索引中的排序很重要。但是读/写的顺序重要吗? 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"} # 无序。
  2. some_dict = bson.son.SON({c: "C", a: "A", b: "B"})

没有任何区别,但建议使用 2nd,我不知道为什么。

【问题讨论】:

  • 字段顺序在查询对象中无关紧要。我认为如果它这样做会被认为是一个错误,因为它与查询的含义无关。这就是您所说的“在读/写中排序”的意思吗?
  • 是的字段顺序。类似于:db.table.find({"a": A, "b": B})
  • @JohnnyHK 用一个例子编辑了我的问题。希望现在更清楚了。

标签: mongodb pymongo


【解决方案1】:

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

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

对比

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

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

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

对比

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

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

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

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

【讨论】:

  • 是的,你是对的。无关紧要是有道理的,但在 python 的 mongo api (api.mongodb.org/python/current/api/bson/son.html) 中,它指出:“可以使用常规字典代替 SON 对象,但当键的顺序很重要时就不行了..”我认为它是谈论索引等。那么什么时候键的顺序很重要呢?
  • 这是 python 特有的东西,因为 python dicts 不维护键上的任何顺序。
  • 是的,当订购字典很重要时,它仍然无法回答。我想当插入/更新的数据需要根据应用程序按特定顺序排列时,这对用户很重要。除了我想不出任何其他原因。感谢您的回答!
  • 如果您使用的是复合文档键,则有序字典很重要。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2020-11-19
  • 2023-01-23
  • 2013-10-27
  • 2015-08-29
  • 2013-05-28
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多