Я пытаюсь использовать структуру агрегации с этапами $match
и $group
. Использует ли индексные данные $group
? Я использую последнюю доступную версию mongodb - 2.5.4
Структура агрегации Mongodb: используется ли индекс использования группы?
Ответ 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/....