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.