sql >> Base de Datos >  >> RDS >> Mysql

¿Tiene sentido usar un índice que tendrá una cardinalidad baja?

Un índice puede ayudar incluso en campos de baja cardinalidad si:

  1. 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 .

  2. 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 primer 2010 grabar si no fuera por el índice.

  3. 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 el LIMIT , aún necesitaría un escaneo completo de la tabla.

  4. 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
    
  5. 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á.