Mongo $ в производительности оператора - PullRequest
41 голосов
/ 10 февраля 2011

Это медленная / плохая форма использования оператора $ in в MongoDB с большим набором возможностей?

posts.find({
    author : {
        $in : ['friend1','friend2','friend3'....'friend40'] 
    }
})

App Engine, например, не позволит вам использовать более 30, потому что они преобразуются непосредственно в один запрос на элемент в массиве IN, и вместо этого вынудите вас использовать их метод для обработки fan out . Хотя это, вероятно, самый эффективный метод в Mongo, код для него значительно сложнее, поэтому я предпочел бы просто использовать этот универсальный метод.

Будет ли Mongo эффективно выполнять эти $ в запросах для наборов данных разумного размера?

Ответы [ 3 ]

25 голосов
/ 10 февраля 2011

Это может быть довольно эффективно с небольшими списками (трудно сказать, что такое маленький, но, по крайней мере, в десятки / сотни) за $ in.Он не работает как app-engine, так как mongodb имеет фактические индексы btree и не является хранилищем столбцов, как bigtable.

С $ в нем можно будет пропустить индекс, чтобы найти соответствующие документы, или пройтись повся коллекция, если нет индекса для использования.

11 голосов
/ 19 сентября 2016

Если вы создали индекс для поля author, с алгоритмической точки зрения временная сложность операции $in равна: $(N*log(M)), где N - длина входного массива, а M - Размер коллекции.

Временная сложность операции $in не изменится , если вы не измените базу данных (хотя я не думаю, что какой-либо БД может сломаться O(N*log(M))).

Однако, с инженерной точки зрения, если N переходит к большому числу, лучше позволить серверу бизнес-логики имитировать операцию $in, либо в пакетном режиме, либо по одному.

Это просто потому, что память на серверах баз данных намного ценнее, чем память на серверах бизнес-логики.

10 голосов
/ 11 февраля 2011

Если вы строите индекс (sureIndex) для элемента списка, он должен быть довольно быстрым.

Вы пытались использовать объяснение ()?Это хороший встроенный способ для профилирования ваших запросов: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Use%7B%7Bexplain%7D%7D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...