¿Qué es la cardinalidad de un índice?

Autor: Publicado

En resumen: La cardinalidad de un índice es el número de valores distintos de la clave que contiene el índice; la base de datos suele presentarla como una estimación. Ayuda al optimizador a calcular cuántas filas pueden cumplir la condición de una consulta y si conviene usar el índice. Una cardinalidad alta suele favorecer la búsqueda de registros concretos, pero no garantiza por sí sola una ejecución más rápida.

Qué significa exactamente la cardinalidad de un índice

Un índice es una estructura de datos adicional que facilita la búsqueda de filas sin recorrer toda la tabla. Su clave está formada por el valor de una columna o por un conjunto de valores de varias columnas. La cardinalidad indica cuántas claves distintas hay en los datos, no cuántas entradas contiene el índice en total.

Supongamos que la tabla clientes tiene 100 000 filas. Si cada cliente tiene un identificador distinto, la cardinalidad del índice sobre la columna id es de 100 000. Si la columna estado solo contiene los valores activo, inactivo y bloqueado, su cardinalidad es de 3.

El número que muestran las herramientas de administración no siempre corresponde a un recuento exacto de los datos. El motor puede calcularlo a partir de una muestra y guardarlo en las estadísticas, es decir, la información sobre el contenido de las tablas que se utiliza para planificar las consultas. Consulta la documentación del motor concreto para saber cómo se interpreta el valor NULL y cómo se presenta la cardinalidad.

Cardinalidad y selectividad de una consulta

La cardinalidad es una propiedad de los datos del índice. La selectividad de una condición, en cambio, describe hasta qué punto esa condición reduce el conjunto de resultados. En la práctica, una condición que selecciona una pequeña parte de la tabla se considera muy selectiva. Al comparar indicadores numéricos, conviene comprobar su definición, ya que las convenciones utilizadas pueden variar.

Al buscar un identificador único, la base de datos puede encontrar una sola fila. Para la condición status = 'activo', puede necesitar miles o decenas de miles de filas. En el segundo caso, leer el índice y después recuperar los registros de la tabla puede resultar más costoso que recorrerla por completo.

Sin embargo, el número de valores distintos no indica con qué frecuencia aparece cada uno. Si 99 000 clientes están activos y solo 20 están bloqueados, el índice puede ser mucho más útil para una de esas condiciones que para la otra, aunque ambas se apliquen a la misma columna. La cardinalidad sigue siendo 3, pero la distribución de los datos es desigual.

Por este motivo, el optimizador —la parte del motor que elige cómo ejecutar la consulta— también puede utilizar otras estadísticas, como histogramas que describen la distribución de los valores. Su disponibilidad y la forma de utilizarlos dependen de la base de datos.

Cómo interpretar la cardinalidad de un índice compuesto

Un índice compuesto abarca más de una columna. En un índice sobre (pais, ciudad), lo que importa es el número de pares distintos, no solo el número de países o ciudades considerados por separado.

Por ejemplo, una tabla puede contener 10 países y 500 pares distintos de país y ciudad. En ese caso, la cardinalidad de la primera parte de la clave es de 10 y la de la clave completa es de 500. No hay que multiplicar automáticamente el número de países distintos por el de ciudades distintas, porque no todas las combinaciones posibles tienen por qué aparecer en la tabla.

Algunas herramientas muestran estimaciones independientes para las sucesivas partes iniciales del índice. En MySQL, el campo Cardinality del resultado de SHOW INDEX debe interpretarse junto con la posición de la columna indicada por Seq_in_index: la estimación corresponde al prefijo del índice que termina en esa posición.

El orden de las columnas también influye en el uso del índice. En un índice B-tree típico, es decir, un índice con una estructura de árbol ordenada, (pais, ciudad) facilita la búsqueda por país y por país y ciudad. Buscar únicamente por ciudad puede requerir otra forma de acceso; las optimizaciones disponibles dependen del motor.

Por qué una cardinalidad alta no basta

Un índice sobre una columna cuyos valores son casi todos únicos puede ser una buena opción para comparar con un valor concreto, pero resultar menos útil para un intervalo amplio. Una consulta que recupera la mayoría de los registros según su fecha puede no utilizar el índice, aunque las fechas tengan muchos valores distintos.

También importa cómo se expresa la condición. Aplicar una función a la columna indexada, por ejemplo para extraer solo el año de una fecha, puede dificultar el uso de un índice convencional. Hay que comprobar si el motor permite utilizar un índice basado en funciones o reformular la consulta de manera adecuada.

Además, un índice puede ayudar a ordenar datos, combinar tablas o leer datos sin acceder a la tabla si contiene todas las columnas necesarias. Por eso, una cardinalidad baja no es por sí sola un motivo para eliminar un índice. También hay que tener en cuenta su coste: el espacio que ocupa y el trabajo adicional al escribir y actualizar datos.

Cómo comprobar si un índice ayuda

Evalúa el índice a partir de una consulta real, no solo del número que aparece en el panel de administración:

  1. Elige una consulta habitual y valores representativos de sus parámetros, incluidos valores frecuentes y poco frecuentes.
  2. Examina el plan de ejecución con EXPLAIN o su equivalente en el motor que utilices.
  3. Fíjate en el índice elegido, el número estimado de filas y la forma de acceder a la tabla.
  4. Si es seguro hacerlo, compara las estimaciones con la ejecución real. Recuerda que los comandos que analizan la ejecución pueden ejecutar la consulta.
  5. Si hay grandes discrepancias, comprueba si las estadísticas están actualizadas y consulta en la documentación de la base de datos cómo se actualizan.

Tras una importación masiva, la eliminación de registros o un cambio en la distribución de los valores, las estadísticas pueden dejar de reflejar los datos actuales. Antes de añadir otro índice, revisa el plan de la consulta problemática y el estado de las estadísticas. Así podrás distinguir entre la falta de un índice adecuado y una estimación incorrecta de los costes.

Véase también: ¿Qué es FireFox?

Lee también

Descubre cómo PHP-FPM atiende peticiones PHP, en qué se diferencia de un servidor web y cómo ajustar sus procesos al tráfico y los recursos.
Conoce BIND, el software abierto de servidor DNS: sus funciones, cómo gestiona dominios y cuándo conviene instalarlo por tu cuenta.
Descubre qué son el registro REGON de Polonia y su número, en qué se diferencian de NIP y KRS y cómo verificar los datos de una empresa.