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

MySQL:columnas de baja cardinalidad/selectividad =¿cómo indexar?

El índice que describes es bastante inútil. Un índice se utiliza mejor cuando necesita seleccionar un pequeño número de filas en comparación con el total de filas.

La razón de esto está relacionada con la forma en que una base de datos accede a una tabla. Las tablas se pueden evaluar mediante un escaneo completo de la tabla, donde cada bloque se lee y procesa a su vez. O mediante una búsqueda de ID de fila o clave, donde la base de datos tiene una clave/ID de fila y lee la fila exacta que requiere.

En el caso de que utilice una cláusula where basada en la clave principal u otro índice único, p. where id = 1 , la base de datos puede usar el índice para obtener una referencia exacta de dónde se almacenan los datos de la fila. Esto es claramente más eficiente que hacer un escaneo completo de la tabla y procesar cada bloque.

Ahora volviendo a su ejemplo, tiene una cláusula where de where status = 'enabled' , el índice devolverá filas de 150m y la base de datos tendrá que leer cada fila a su vez usando lecturas pequeñas separadas. Mientras que acceder a la tabla con un escaneo completo de la tabla permite que la base de datos haga uso de lecturas más grandes y más eficientes.

Hay un punto en el que es mejor simplemente hacer un escaneo completo de la tabla en lugar de usar el índice. Con mysql puedes usar FORCE INDEX (idx_name) como parte de su consulta para permitir comparaciones entre cada método de acceso a la tabla.

Referencia:http://dev .mysql.com/doc/refman/5.5/en/how-to-evite-table-scan.html