Mongo $в работе оператора
Является ли медленная/плохая форма использовать оператор $in в MongoDB с большим количеством возможностей?
posts.find({
author : {
$in : ['friend1','friend2','friend3'....'friend40']
}
})
App Engine, например, не позволит вам использовать более 30, потому что они переводят непосредственно на один запрос на элемент в массиве IN, и вместо этого вместо этого вы используете свой метод для обработки отключить. Хотя это, вероятно, самый эффективный метод в Монго, код для него значительно сложнее, поэтому я бы предпочел просто использовать этот общий метод.
Будет ли Mongo эффективно выполнять эти $в запросах для наборов данных разумного размера?
Ответы
Ответ 1
Он может быть довольно эффективным с небольшими списками (трудно сказать, что мало, но по крайней мере в десятки/сотни) для $in. Он не работает, как приложение-движок, поскольку mongodb имеет фактические индексы btree и не является хранилищем столбцов, например bigtable.
С помощью $in он будет пропускать в индексе, чтобы найти соответствующие документы, или пройти через всю коллекцию, если нет индекса для использования.
Ответ 2
Если вы создаете индекс (securityIndex) в элементе списка, он должен быть довольно быстрым.
Вы пытались использовать explain()? Его хороший, встроенный способ профилировать ваши запросы:
http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Use%7B%7Bexplain%7D%7D.
Ответ 3
Предполагая, что вы создали индекс в поле author
, с алгоритмической точки зрения временная сложность операции $in
: $(N*log(M))
, где N
- длина входного массива, а M
- размер коллекции.
Временная сложность операции $in
будет не изменяться, если вы не измените базу данных (хотя я не думаю, что любой db может сломать O(N*log(M))
).
Однако, с технической точки зрения, если N
переходит на большое число, лучше разрешить серверу вашей бизнес-логики имитировать операцию $in
либо пакетным, либо одно за другим.
Это просто потому, что: память на серверах баз данных более ценна, чем память на серверах бизнес-логики.