Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySql très lente

La différence de performances est possible du fait de e.id_dernier_fichier étant dans l'index utilisé pour le JOIN, mais e.codega ne pas être dans cela indice.

Sans une définition complète des deux tables et de tous leurs index, il n'est pas possible de le dire avec certitude. En outre, il serait utile d'inclure les deux plans EXPLAIN pour les deux requêtes.


Pour l'instant, cependant, je peux élaborer sur quelques points...

Si un INDEX est CLUSTERED (ceci s'applique également aux PRIMARY KEYs), les données sont en fait stockées physiquement dans l'ordre de l'INDEX. Cela signifie que savoir que vous voulez position x dans l'INDEX signifie aussi implicitement que vous voulez position x dans le TABLEAU.

Si l'INDEX n'est pas groupé, cependant, l'INDEX vous fournit simplement une recherche. Dire efficacement position x dans l'INDEX correspond à la position y dans le TABLEAU.

L'importance ici est lors de l'accès à des champs non spécifiés dans l'INDEX. Cela signifie que vous devez réellement accéder à la TABLE pour obtenir les données. Dans le cas d'un INDEX CLUSTERED, vous y êtes déjà, la surcharge de recherche de ce champ est assez faible. Si l'INDEX n'est pas groupé, cependant, vous devez effectivement JOINDRE la TABLE à l'INDEX, puis trouver le champ qui vous intéresse.


Noter; Avoir un index composite sur (id_dernier_fichier, codega) est très différent d'avoir un seul index sur (id_dernier_fichier) et un index séparé sur seulement (codega) .


Dans le cas de votre requête, je ne pense pas que vous ayez besoin de modifier le code du tout. Mais vous pouvez bénéficier de la modification des index.

Vous mentionnez que vous souhaitez accéder à plusieurs des champs. Mettre tous ces champs dans un index composite n'est probablement pas la meilleure solution. Au lieu de cela, vous pouvez créer un INDEX CLUSTERED sur (id_dernier_fichier) . Cela signifie qu'une fois le *id_dernier_fichier* localisé, vous êtes déjà au bon endroit pour obtenir tous les autres champs également.


MODIFIER Remarque sur MySQL et les INDEX CLUSTERED

13.2.10.1. Index groupés et secondaires

Chaque table InnoDB possède un index spécial appelé index clusterisé où les données des lignes sont stockées :

  • Si vous définissez une CLÉ PRIMAIRE sur votre table, InnoDB l'utilise comme index clusterisé.
  • Si vous ne définissez pas de PRIMARY KEY pour votre table, MySQL sélectionne le premier index UNIQUE qui n'a que des colonnes NOT NULL comme clé primaire et InnoDB l'utilise comme index clusterisé.
  • Si la table n'a pas de CLÉ PRIMAIRE ou d'index UNIQUE approprié, InnoDB génère en interne un index clusterisé caché sur une colonne synthétique contenant des valeurs d'ID de ligne. Les lignes sont triées par l'ID qu'InnoDB attribue aux lignes d'une telle table. L'ID de ligne est un champ de 6 octets qui augmente de manière monotone à mesure que de nouvelles lignes sont insérées. Ainsi, les lignes classées par l'ID de ligne sont physiquement dans l'ordre d'insertion.