Ответ
Да, работал. Индексы в MongoDB — это специальные структуры данных, которые хранят небольшую часть данных коллекции в упорядоченном виде. Их основная цель — кардинально ускорить операции поиска и сортировки. Однако они замедляют операции записи (вставка, обновление, удаление), так как при каждом изменении документа СУБД нужно обновлять и индексы.
Основные типы индексов:
- Single Field: Индекс по одному полю. Самый простой и распространённый тип.
- Compound: Составной индекс по нескольким полям. Порядок полей в индексе критически важен! Правило
ESR
(Equality, Sort, Range) помогает выбрать правильный порядок: сначала поля для точного совпадения, затем для сортировки, и в конце — для диапазонных запросов. - Multikey: Создаётся для полей, содержащих массивы. MongoDB создаёт отдельную запись в индексе для каждого элемента массива.
- Text: Для реализации полнотекстового поиска по строковым полям.
- Geospatial: Для запросов, связанных с геоданными (поиск по координатам, в радиусе и т.д.).
- TTL (Time-To-Live): Специальный индекс, который позволяет MongoDB автоматически удалять документы по истечении определённого времени.
- Unique: Гарантирует, что значения индексируемого поля (или комбинации полей) будут уникальными в коллекции.
Пример создания индекса в Go:
// Создание уникального составного индекса по полям 'username' (по возрастанию) и 'email' (по убыванию)
indexModel := mongo.IndexModel{
Keys: bson.D{
{Key: "username", Value: 1}, // 1 для ascending
{Key: "email", Value: -1}, // -1 для descending
},
Options: options.Index().SetUnique(true),
}
_, err := collection.Indexes().CreateOne(context.Background(), indexModel)
Как я оптимизирую запросы:
- Анализ запросов: Использую метод
explain("executionStats")
для анализа плана выполнения запроса. Он показывает, используются ли индексы, сколько документов было просканировано (totalDocsExamined
) и сколько возвращено (nReturned
). В идеале эти два числа должны быть близки. - Покрывающие запросы (Covered Queries): Стараюсь строить индексы так, чтобы они включали все поля, необходимые для запроса (и в
find
, и вprojection
). В этом случае MongoDB может вернуть результат прямо из индекса, не обращаясь к самим документам, что очень быстро. - Правильный выбор полей для индекса: Индексирую поля, по которым часто происходит фильтрация (
find
), сортировка (sort
) и агрегация ($lookup
,$group
). - Контроль количества индексов: Избегаю создания избыточных индексов, так как каждый из них потребляет память и замедляет операции записи.