Un índice compuesto contiene varias claves en un orden definido. Ese orden determina qué filtros, rangos, sorts y prefijos puede resolver eficientemente.
Una query solo por b no puede saltar directamente al mismo rango que una query por a. Algunas versiones y planes pueden aplicar estrategias adicionales, pero no diseñes suponiendo acceso equivalente sin explain().
El orden entre varios equality fields puede tener menos impacto para una única query, pero afecta prefixes, otras queries, compresión y reglas como shard key o uniqueness.
No ordenes campos solo por “el más selectivo primero” sin revisar el conjunto de access patterns.
Para soportar sort, los campos anteriores deben estar fijados de forma compatible.
Índice:
JavaScript
{businessId:1,status:1,createdAt:-1,_id:-1}
Query:
JavaScript
{ businessId,status:'pending'}
Sort:
JavaScript
{createdAt:-1,_id:-1}
Puede recorrerse ordenadamente. Si omites status del filtro, el orden global por createdAt puede no estar disponible de la misma forma porque existen bloques por status.
Un rango restringe la capacidad de usar campos posteriores para sort y bounds de forma ideal.
JavaScript
{createdAt:{$gte: start,$lt: end }}
Después del primer campo de rango, los siguientes campos pueden utilizarse de manera limitada para filtering o sort según shape. Por eso ESR coloca sort antes de range cuando evitar el sort es prioritario.
Cuando el rango es muy selectivo y el sort pequeño, puede convenir Equality–Range–Sort. El servidor filtra pocos documentos y ordenarlos puede ser barato.
No decidas por siglas: compara ambos planes con datos representativos.
$in puede comportarse como múltiples equality values o como un rango amplio dependiendo de cantidad y contexto. Los umbrales y optimizaciones pueden cambiar por versión.
Limita listas enviadas por usuarios y verifica plan con cardinalidades reales.
MongoDB puede combinar índices en algunos planes. No depende de ello como sustituto de un compound crítico. Intersection puede examinar más claves y no resolver sort tan bien.
status: 'pending' puede ser selectivo globalmente, pero un tenant outlier puede tener millones de pendientes. Estadísticas promedio no representan todas las claves.
Si un campo del compound es array, el índice se vuelve multikey. Existen restricciones cuando varios campos son arrays y para sort/coverage. El schema debe conocerse antes de crear el índice.
El orden de un compound index define su utilidad. ESR es una guía para razonar sobre igualdad, orden y rangos, no una receta. El índice correcto es el que sirve una query shape crítica con coste total aceptable y resultados verificados.