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

Consulta MySql muy lenta

La diferencia en el rendimiento es posiblemente debido a e.id_dernier_fichier estar en el índice utilizado para JOIN, pero e.codega no estar en eso índice.

Sin una definición completa de ambas tablas y todos sus índices, no es posible saberlo con certeza. Además, sería útil incluir los dos EXPLICAR PLAN para las dos consultas.


Por ahora, sin embargo, puedo dar más detalles sobre un par de cosas...

Si un ÍNDICE está AGRUPADO (esto también se aplica a las CLAVES PRINCIPALES), los datos se almacenan físicamente en el orden del ÍNDICE. Esto significa que saber que desea posición x en el ÍNDICE también implícitamente significa que desea posición x en la TABLA.

Sin embargo, si el ÍNDICE no está agrupado, el ÍNDICE solo le proporciona una búsqueda. Decir efectivamente posición x en el ÍNDICE corresponde a posición y en la TABLA.

La importancia aquí es cuando se accede a campos no especificados en el ÍNDICE. Si lo hace, significa que tiene que ir a la TABLA para obtener los datos. En el caso de un ÍNDICE CLUSTERADO, ya está allí, la sobrecarga de encontrar ese campo es bastante baja. Sin embargo, si el ÍNDICE no está agrupado, debe UNIR la TABLA al ÍNDICE y luego buscar el campo que le interesa.


Nota; Tener un índice compuesto en (id_dernier_fichier, codega) es muy diferente de tener un índice en solo (id_dernier_fichier) y un índice separado en solo (codega) .


En el caso de su consulta, no creo que necesite cambiar el código en absoluto. Pero usted puede beneficiarse de cambiar los índices.

Mencionas que quieres acceder a muchos campos. Poner todos esos campos en un índice compuesto probablemente no sea la mejor solución. En su lugar, es posible que desee crear un ÍNDICE AGRUPADO en (id_dernier_fichier) . Esto significará que una vez que se haya localizado el *id_dernier_fichier*, ya estará en el lugar correcto para obtener todos los demás campos también.


EDITAR Nota sobre MySQL y los ÍNDICES CLUSTERED

13.2.10.1. Índices agrupados y secundarios

Cada tabla de InnoDB tiene un índice especial llamado índice agrupado donde se almacenan los datos de las filas:

  • Si define una CLAVE PRINCIPAL en su tabla, InnoDB la usa como índice agrupado.
  • Si no define una CLAVE PRINCIPAL para su tabla, MySQL elige el primer índice ÚNICO que solo tiene columnas NO NULAS como clave principal e InnoDB lo usa como índice agrupado.
  • Si la tabla no tiene PRIMARY KEY o un índice ÚNICO adecuado, InnoDB genera internamente un índice agrupado oculto en una columna sintética que contiene valores de ID de fila. Las filas están ordenadas por el ID que InnoDB asigna a las filas en dicha tabla. El ID de fila es un campo de 6 bytes que aumenta de forma monótona a medida que se insertan nuevas filas. Por lo tanto, las filas ordenadas por ID de fila están físicamente en orden de inserción.