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

Indexación de una columna que tiene valores duplicados

Basado en la especificación incompleta, haría esto:

   CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)

Este índice cumpliría el requisito de un índice con storeid como columna principal. (Y sabemos que tendrá ese requisito si se trata de InnoDB y storeid es una clave foránea.)

Con una fila de tabla tan corta, continuaría y la convertiría en un índice de cobertura e incluiría todas las columnas. Luego, las consultas se pueden satisfacer directamente desde las páginas de índice sin búsquedas en las páginas de datos en la tabla subyacente.

Como sabemos que (seedid,storeid) es único (dado como PRIMARY KEY), conocemos (storeid,seedid) también es único, por lo que también podríamos declarar el índice como ÚNICO.

Hay otras opciones; no tenemos que crear ese índice arriba. Podríamos hacer esto en su lugar:

   CREATE INDEX stock_IX2 ON stock (storeid)

Pero eso usará casi la misma cantidad de espacio y no será tan beneficioso para tantas consultas posibles.

El índice secundario contendrá la clave principal de la tabla; para que el segundo índice incluya el seedid columna, dada la CLAVE PRINCIPAL de la tabla. Es decir, el índice es equivalente a esto:

   CREATE INDEX stock_IX3 ON stock (storeid,seedid)

Y sabemos que la combinación de esas dos columnas es única, por lo que podemos incluir la palabra clave ÚNICA

   CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)

Si hacemos un EXPLAIN sobre una consulta del formulario

  EXPLAIN
  SELECT t.storeid
       , t.seedid
       , t.stk 
    FROM stock t 
   WHERE t.storeid = 'foo'

es probable que veamos una operación de escaneo de rango en el índice secundario; pero recuperando el valor de stk la columna requerirá la búsqueda de las páginas de datos en la tabla subyacente. Incluyendo el stk columna en el índice secundario hará que el índice sea una cobertura índice de la consulta. Con el índice recomendado primero en la respuesta, esperamos el EXPLAIN salida para mostrar "Usando el índice".