В MongoDB какие поля нужно выбрать для построения индексов?

Если есть запрос, который фильтрует по полям a и b, а затем упорядочивает по c, нужно ли мне создавать отдельные индексы для a, b и c, или я должен на самом деле составлять составной индекс (a, b, c)? А также, должна ли последовательность в запросе соответствовать последовательности в индексе? то есть, если последовательность фильтра в запросе - это фильтр b, фильтр c, а затем порядок по a, то лучше ли иметь составной индекс (b, c, a)?

2 ответа

Решение

Поскольку MongoDB в настоящее время использует только один индекс для запроса, вам потребуется составной индекс.

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

Поскольку фильтрация выполняется первой, если индекс был (c,b,a), это было бы не очень полезно для фильтрации, особенно если в коллекции много элементов. Поля, используемые для сортировки, должны быть указаны последними в индексе.

Таким образом, индекс должен быть (a,b,c) или (b,a,c). Какой из них должен быть, зависит от избирательности - другими словами, в каком поле будут удалены элементы, которые не совпадают быстрее?

Если существует 10000 вероятных значений для b и только два вероятных значения для a, то индекс должен быть (b,a,c). И наоборот, если есть еще много возможных значений для a, то, вероятно, должно быть (a,b,c). Если эти два поля примерно одинаковы по своей способности исключать документы из запроса, это не будет иметь большого значения.

Все это и многое другое дано в документации. Смотрите разделы по составным индексам.

Порядок параметров запроса не имеет значения.

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