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

Cobertura Mysql vs compuesto vs índice de columna

No es lo mismo un índice de cobertura que un índice compuesto.

Si tengo 2 índices separados, uno en col3 y el otro en col4, ¿cuál de ellos se usará en esta consulta?

El índice con la cardinalidad más alta.
MySQL mantiene estadísticas sobre qué índice tiene qué propiedades.
Se utilizará el índice que tenga el mayor poder de discriminación (como es evidente en las estadísticas de MySQL).

Leí en alguna parte que para cada tabla en la consulta solo se usa un índice. ¿Significa eso que no hay forma de que la consulta use ambos índices?

Puede usar una subselección.
O incluso mejor, use un índice compuesto que incluya col3 y col4.

En segundo lugar, si creé un índice compuesto usando col3 y col4 juntos pero usé solo col3 en la cláusula WHERE, ¿será peor para el rendimiento? ejemplo:

Índice compuesto
El término correcto es compound índice, no compuesto.
Solo el más a la izquierda se usará parte del índice compuesto.
Entonces, si el índice se define como

index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

Ver:http://dev.mysql.com /doc/refman/5.0/es/multiple-column-indexes.html

Tenga en cuenta que si selecciona un campo más a la izquierda, puede salirse con la suya sin usar esa parte del índice en su cláusula where.
Imagine que tenemos un índice compuesto

Myindex(col1,col2)

SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  

La razón por la que esto funciona es que la primera consulta usa el índice de cobertura y realiza un escaneo sobre eso.
La segunda consulta necesita acceder a la tabla y, por esa razón, escanear el índice no tiene sentido.
Esto solo funciona en InnoDB.

¿Qué es un índice de cobertura?
Un índice de cobertura se refiere al caso en que todos los campos seleccionados en una consulta están covered por un índice, en ese caso InnoDB (no MyISAM) nunca leerá los datos en la tabla, sino que solo usará los datos en el índice, acelerando significativamente la selección.
Tenga en cuenta que en InnoDB la clave principal está incluida en todos los índices secundarios, por lo que en cierto modo todos los índices secundarios son índices compuestos.
Esto significa que si ejecuta la siguiente consulta en InnoDB:

SELECT indexed_field FROM table1 WHERE pk = something

MySQL siempre usará un índice de cobertura y no accederá a la tabla real. Aunque podría usar un índice de cobertura, preferirá la PRIMARY KEY porque solo necesita golpear una sola fila.