Como regla general, en un índice de varias columnas, desea que las columnas que tengan la cardinalidad más alta, o en otras palabras, la mayor cantidad de valores distintos, ocupen el primer lugar en el índice.
Para ser más precisos, primero desea la columna con la menor cantidad posible de coincidencias con sus criterios de búsqueda para que pueda restringir el conjunto de resultados tanto como sea posible, pero en general, es lo mismo que la cardinalidad más alta.
Entonces, en su ejemplo, querrá que la columna que tendrá millones de valores distintos esté en el índice antes que la que tiene solo 6 valores distintos.
Suponiendo que está seleccionando solo una fila de los millones de valores, le permite eliminar más filas más rápido.
Al considerar dos columnas de cardinalidad similar, coloque la más pequeña primero (INTEGER
columnas antes de VARCHAR
columnas) porque MySQL puede compararlas e iterar sobre ellas más rápido.
Una advertencia es que si está seleccionando con rangos (por ejemplo, WHERE datecol > NOW()
), entonces quiere las columnas de rango más a la derecha y sus columnas con una sola constante (por ejemplo, WHERE id = 1
) A la izquierda. Esto se debe a que su índice solo se puede usar para buscar y ordenar hasta el punto del primer valor de rango.