2014-09-19 2 views
2

Заказ в сложных показателях. Но делает ли заказ в чтении/записи вопрос? Является ли mongodb достаточно умным, чтобы изменить порядок полей на основе доступных индексов?Является ли упорядоченный словарь (python) параметром w.r.t?

Код находится на python. Я читал, что желательно использовать в упорядоченном словаре, используя: http://api.mongodb.org/python/current/api/bson/son.html.

Но после переключения между упорядоченными и неупорядоченными словарями я не вижу разницы в производительности. Запуск объяснения по любым параметрам показал, что он оценил разные индексы (поле allPlans) и взял индекс, порядок которого отличался от того, как он получил запрос.

Если бы это было подтверждено в любом случае.

Я использую mongo 2.6. Может быть, манго добавил какую-то оптимизацию в своих новых версиях.

Edit: (добавлен пример) Для экс:

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 ({с: "С", а: "А", Ь: "В"})

Ни сделал никакой разницы, но рекомендуется использовать 2-е, I не знаю почему.

+3

Порядок полей не имеет значения в объекте запроса. Я предполагаю, что это будет считаться ошибкой, если это произойдет, поскольку оно не влияет на смысл запроса. Это то, что вы подразумеваете под «упорядочением при чтении/записи»? – JohnnyHK

+0

Да, порядок на поле. Что-то вроде: db.table.find ({"a": A, "b": B}) – shrnkrn

+0

@JohnnyHK отредактировал мой вопрос на примере. Надеюсь, теперь все ясно. – shrnkrn

ответ

0

Порядок, в котором вы указываете поля в запросе, например.

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.

+0

Да, вы правы. Для него имеет смысл не иметь значения, но здесь, в python mongo api (http://api.mongodb.org/python/current/api/bson/son.html), в нем говорится: «Вместо SON SON можно использовать обычные словари объектов, но не тогда, когда порядок ключей важен. »Я предположил, что речь идет об индексах и тому подобных. Когда порядок ключей важнее? – shrnkrn

+0

Это специфичная для python вещь, потому что python dicts не поддерживает никакого порядка на клавишах. – wdberkeley

+0

Да, хорошо, что все еще не отвечает, когда заказываются словари. Я думаю, это важно для пользователей, когда вставляемые/обновляемые данные должны быть в определенном порядке в зависимости от приложения. Кроме того, я не могу думать ни о какой другой причине. Спасибо за ответ! – shrnkrn