Производительность Couchdb Mango против карты Снижение просмотров

Я только что заметил, что в примечаниях к выпуску Couchdb 2.0 упоминается, что запросы Mango рекомендуются для новых приложений. Также упоминается, что, по-видимому, индексы Mango в 2–10 раз быстрее, чем запросы javascript, что меня очень удивило, поэтому у меня есть ряд вопросов:

  • Карта / Уменьшить представления постепенно сокращаются? Я ожидаю, что ответ будет отрицательным, так как мне кажется, что Mango не охватывает все случаи использования Map/Reduce (самый простой пример - сам Reduce), и гибкость этого стиля запросов также кажется более ограниченной. Но я предпочитаю спросить из-за рекомендации:

Мы рекомендуем всем новым приложениям начать использовать Mango по умолчанию.

  • Мы знаем, что представления Map/Reduce основаны на B-деревьях, но я не могу найти какой-либо информации в документе или списке рассылки о магии, стоящей за Mango. Манго по сути является для меня белой магией. Тем не менее, я могу сказать, что глубокое знание того, как представления javascript индексируются за кулисами, было чрезвычайно полезным, чтобы избежать подводных камней, наивных реализаций, а также оптимизировать производительность. У кого-нибудь есть понимание того, как работает Манго? Индексы B-деревья тоже? Когда обновляются индексы, так как больше нет проектных документов? Откуда берется прирост производительности? (эти достижения для меня нелогичны, так как в моем понимании производительность запросов javascript пришла из предвычисленной природы функций Map)

То, что я, по сути, ищу, это, с одной стороны, некоторое представление о Манго, а с другой стороны, обзор того, как Манго и Map/Reduce должны жить вместе в эпоху 2.x.

3 ответа

Решение

Ответ от основного разработчика:

Несколько хороших вопросов. Я не думаю, что Mango когда-либо полностью заменит Map/Reduce. Это альтернативный инструмент запросов. Что хорошо в синтаксисе запроса Mango, так это то, что его гораздо проще понять и начать. И мы можем использовать его во многих местах за пределами простого запроса документов. Его можно использовать для фильтрации репликации и подачи изменений. Мы надеемся, что скоро будет поддержка обновлений документации для проверки.

Под Манго используется карта / уменьшение Эрланга. Это означает, что он создает индекс B-дерева, как карта / уменьшить. Что делает его быстрее, так это то, что он использует функции erlang/native для создания B-дерева вместо javascript. Я написал пост в блоге давным-давно о внутренностях PouchDB-find [1], который является синтаксисом манго для PouchDB. Это может помочь вам понять немного больше, как работают внутренние органы. Главное, что нужно понять, это то, что есть часть запроса Map, которая использует B-Tree и фильтр в памяти. В идеале, чем меньше фильтрации памяти вы делаете, тем быстрее будет ваш запрос.

Я бы сказал, что Mango - это в значительной степени работа в процессе, но основная наземная работа выполнена. Есть определенные вещи, которые мы можем улучшить. Я видел, что он довольно часто использовался, когда разработчики запускают новый проект, потому что он быстро и просто выполняет базовые запросы, такие как поиск по адресу электронной почты или поиск всех пользователей с именем "Джон Рэмбо".

Надеюсь, это поможет.

[1] http://www.redcometlabs.com/blog/2015/12/1/a-look-under-the-covers-of-pouchdb-find

Недавно я попытался переключить свое приложение на использование запросов Mango, в результате чего его полностью удалили и переключили обратно на отображение / уменьшение. Вот несколько моих причин:

  1. Манго содержит ошибки, когда имеет дело с запросами, которые точно не указывают индекс для использования. На прошлых выходных этот отвез меня на некоторое время. Если вы не укажете индекс, иногда будет выбран альтернативный индекс, который не даст никаких (или неверных) результатов.
  2. Производительность манго не "волшебная". Многие типы запросов будут в конечном итоге делать в поисках памяти. Диван выберет индекс наилучшего соответствия, а затем пройдется по всем этим записям в памяти, чтобы соответствовать угловым случаям. Cloudant hand решает некоторые из этих проблем, говоря, что использует поиск по тексту, который недоступен в Couchdb.
  3. Как вы указали, поиски Mango просто не могут хорошо обрабатывать некоторые типы конструкций запросов. Я не считаю, что мое приложение слишком сложное, но столкнулся с несколькими ситуациями, когда я не мог создать подходящий запрос Mango для поставленной задачи. Основным здесь является поиск в массивах для поиска тегов (например, поиск, чтобы увидеть, какие пользователи являются членами группы). Манго не может индексировать элементы массива, поэтому прибегает к полному сканированию в памяти.
  4. Представления имеют некоторые очень мощные функции для преобразования результатов поиска в виде списков. Этого не существует в Манго.

Ваш пробег может отличаться, но просто хотелось оставить предупреждение, что это все-таки довольно новые функции.

Я новичок в Mango и CouchDB, но я думаю, что могу дать некоторое представление. Как только ваш индекс / представление обновлено, Mango не будет быстрее. Большой прирост производительности с Mango - это когда вы впервые создаете индекс, потому что для этого не нужно создавать отдельный процесс couchjs.

Я обнаружил, что Манго работает хорошо, даже если некоторые из ваших документов большие. В настоящее время с CouchDB 2.0.0, по крайней мере с окнами, большие документы приводят к сбою сервера представления couchjs.exe, используемого с Map/Reduce. Это не относится к CouchDB 1.6.1 и уже исправлено в версии для разработчиков https://github.com/apache/couchdb-couch/commit/1659fda5dd1808f55946a637fc26c73913b57e96

Другие вопросы по тегам