intermediate
Indexes
Создавайте compound, multikey, text, partial и TTL indexes для query shapes, контролируя write amplification.
Индексы MongoDB — B-tree структуры (и специализированные варианты), соответствующие предикатам, сортировке и covered projection. Проектируйте их из `explain("executionStats")`, а не из каждого поля схемы.
// Составной индекс: equality → sort → range
db.orders.createIndex({ customerId: 1, createdAt: -1, status: 1 })
db.orders.find({ customerId: "c_12", status: "open" })
.sort({ createdAt: -1 })
.limit(20)
| Тип индекса | Типичное применение | |-------------|---------------------| | Single / compound | Equality, sort, range по известным путям | | Multikey | Индексация элементов массива | | Text | Токенизированный поиск по строкам | | Partial | Меньший индекс при селективном предикате | | TTL | Автоудаление документов по полю даты |
Каждый индекс увеличивает write amplification и давление на RAM. Индекс по `_id` всегда есть. Запрос без эффективного индекса даёт COLLSCAN — допустимо только на малом масштабе.
На интервью: разберите реальный запрос, индекс под него и влияние на writes.
Типовые ошибки: индекс по полю с низкой cardinality; неверный порядок полей в compound index; multikey на быстро растущих массивах; слишком много индексов при ingestion; ожидание, что OR хорошо использует один индекс.
Компромисс — скорость чтения vs стоимость записи и памяти: каждый лишний индекс обязует поддерживать порядок при каждом insert, update и delete по индексируемым путям.
Чеклист:
- Покажите predicate, sort и projection для горячего запроса.
- Осознанно выберите порядок полей compound index.
- Используйте partial или TTL, когда политика позволяет.
- Читайте executionStats на COLLSCAN и examined docs.