Подтвердить что ты не робот

Структура агрегации Mongodb: используется ли индекс использования группы?

Я пытаюсь использовать структуру агрегации с этапами $match и $group. Использует ли индексные данные $group? Я использую последнюю доступную версию mongodb - 2.5.4

4b9b3361

Ответ 1

$group не использует индексные данные.

Из документов mongoDB:

Операторы конвейера $ match и $ sort могут использовать индекс в начале конвейера.

Оператор конвейера $ geoNear использует геопространственный индекс. При использовании $ geoNear операция конвейера $ geoNear должна отображаться как первая стадия в конвейере агрегации.

Ответ 2

Как говорится в ответе 4J41, $group не (напрямую) использует индекс, хотя $sort делает, если это первая ступень в конвейере. Тем не менее, представляется возможным, что $group, в принципе, может иметь оптимизированную реализацию, если он сразу следует за $sort, и в этом случае вы могли бы эффективно использовать индекс, поставив перед собой $sort.

Похоже, в документах нет однозначного ответа о том, имеет ли $group эту оптимизацию (хотя я держу пари, что она будет, если она будет, поэтому это говорит о том, что это не так). Ответ находится в ошибке 4507 MongoDB: в настоящее время $group НЕ имеет этой реализации, поэтому верхняя строка ответа 4J41 в конце концов верна. Если вам действительно нужна эффективность, в зависимости от приложения может быть быстрее всего использовать обычный запрос и выполнить группировку в своем клиентском коде.

Изменение: как говорит Себастьян ответ, на практике кажется, что $sort (который может использовать индекс) перед тем, как $group может добиться очень большого улучшения скорости. Вышеуказанная ошибка все еще остается открытой, поэтому кажется, что она не дает абсолютного наилучшего возможного преимущества индекса (то есть, начиная группировать элементы по мере загрузки элементов, вместо того, чтобы сначала загружать их все в память). Но это все же определенно стоит сделать.

Ответ 3

Изменено в версии 3.2: Начиная с MongoDB 3.2, индексы могут охватывать конвейер агрегации. В MongoDB 2.6 и 3.0 индексы не могли охватить конвейер агрегации, поскольку даже когда конвейер использует индекс, агрегация по-прежнему требует доступа к фактическим документам.

https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes

Ответ 4

@ArthurTacca, начиная с $sort Mongo 4.0 $sort предшествующей $group, значительно ускорит процесс. См. fooobar.com/info/1969492/....