Un índice puede ayudar incluso en campos de baja cardinalidad si:
-
Cuando uno de los valores posibles es muy poco frecuente en comparación con los otros valores y lo busca.
Por ejemplo, hay muy pocas mujeres daltónicas, así que esta consulta:
SELECT * FROM color_blind_people WHERE gender = 'F'
probablemente se beneficiaría de un índice sobre
gender
. -
Cuando los valores tienden a agruparse en el orden de la tabla:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
Aunque solo hay
3
años distintos aquí, lo más probable es que los registros con años anteriores se agreguen primero, por lo que se tendrían que escanear muchos registros antes de devolver el primer2010
grabar si no fuera por el índice. -
Cuando necesites
ORDER BY / LIMIT
:SELECT * FROM people ORDER BY gender, id LIMIT 1
Sin el índice, un
filesort
sería requerido. Aunque está algo optimizado para elLIMIT
, aún necesitaría un escaneo completo de la tabla. -
Cuando el índice cubre todos los campos utilizados en la consulta:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
Cuando necesites
DISTINCT
:SELECT DISTINCT color FROM tshirts
MySQL
usaráINDEX FOR GROUP-BY
, y si tiene pocos colores, esta consulta será instantánea incluso con millones de registros.Este es un ejemplo de un escenario en el que el índice de un campo de baja cardinalidad es más más eficiente que en un campo de alta cardinalidad.
Tenga en cuenta que si DML
el rendimiento no es mucho en un problema, entonces es seguro crear el índice.
Si el optimizador piensa que el índice es ineficiente, simplemente no se usará.