Command Palette

Search for a command to run...

ES·EN

Nivel 1 · 20 min

CRUD e Índices

Los índices de MongoDB son la herramienta principal para la performance de queries. Entender los tipos de índice, la regla ESR para el diseño de índices compuestos y cómo verificar el uso de índices con explain() es esencial para operaciones de MongoDB en producción.

Tipos de Índice

Los índices single-field indexan un campo en orden ascendente (1) o descendente (-1). Los índices compuestos indexan múltiples campos: el orden importa para la cobertura de queries y el soporte de ordenamiento. Los índices parciales indexan solo documentos que coincidan con una expresión de filtro. Los índices TTL (expireAfterSeconds) eliminan automáticamente documentos después de un período de tiempo. Los índices text soportan búsqueda full-text $text. Los índices multikey manejan automáticamente campos array: MongoDB crea una entrada de índice por elemento del array.

Regla ESR para Índices Compuestos

La regla ESR (Equality-Sort-Range) define el orden óptimo de campos en un índice compuesto. Campos de Equality primero: los campos usados con operadores de match exacto ($eq, $in) deben aparecer primero — filtran la mayoría de documentos rápidamente. Campos de Sort segundo: los campos usados en sort aparecen después — el índice puede satisfacer el sort sin un sort en memoria. Campos de Range al final: los campos usados con $gt, $lt, $gte, $lte aparecen al final. Ejemplo: query filtra status=''active'', ordena por createdAt DESC, rango en price: índice es (status, createdAt, price).

Selectividad de Índices y Covered Queries

La selectividad mide cuántos documentos elimina una clave de índice. Alta selectividad: un campo email donde cada valor es único. Baja selectividad: un campo booleano donde la mitad de los documentos tiene cada valor. Una covered query devuelve todos los datos requeridos solo desde el índice, sin fetch de documentos. Esto requiere que todos los campos proyectados estén en el índice. Ejemplo: índice en (status, email) y query proyecta solo status y email — MongoDB nunca lee el documento, solo el índice.

Puntos clave

  • Regla ESR: Equality primero, Sort segundo, Range al final. Este ordenamiento maximiza la utilización del índice en las tres fases de query.
  • Los índices parciales son sub-utilizados: indexar solo el subconjunto relevante (e.g., usuarios activos) reduce el tamaño del índice y el overhead de escritura sin sacrificar performance.
  • Las covered queries evitan fetches de documentos por completo: las queries MongoDB más rápidas son las servidas íntegramente desde el índice.

Code example

// ESR compound index: status (E), createdAt (S), price (R)\ndb.orders.createIndex(\n  {status: 1, createdAt: -1, price: 1},\n  {name: 'idx_orders_esr}\n)\n\n// Partial index: only active orders\ndb.orders.createIndex(\n  {customerId: 1},\n  {partialFilterExpression: {status: 'active}'}'\n)\n\n// TTL index: auto-delete sessions after 1 hour\ndb.sessions.createIndex(\n  {createdAt: 1},\n  {expireAfterSeconds: 3600}'\n)