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

Mysql trop lent sur une requête simple entre deux tables

Dans InnoDB, chaque index contient implicitement la clé primaire.

Le plan d'explication montre que l'index IDX_NOME est utilisé sur la table Paziente . Le SGBD recherche le nom dans l'index et trouve ID_PAZIENTE là-dedans, qui est la clé dont nous avons besoin pour accéder à l'autre table. Il n'y a donc rien à ajouter. (Dans un autre SGBD on aurait ajouté un index composite sur (NOME, ID_PAZIENTE) pour que cela se produise.)

Ensuite, il y a la table Analisi à envisager. Nous trouvons un enregistrement via FK_ANALISI_PAZIENTE qui contient le ID_PAZIENTE qui sert à trouver la correspondance, et implicitement la clé primaire ID_ANALISI qui pourrait être utilisé pour accéder à la table, mais ce n'est même pas nécessaire, car nous avons toutes les informations dont nous avons besoin à partir de l'index. Il ne reste plus rien que nous ayons besoin de trouver dans le tableau. (Encore une fois, dans un autre SGBD, nous aurions ajouté un index composite sur (ID_PAZIENTE, ID_ANALISI) pour avoir un index de couverture.)

Alors ce qui se passe est simplement :lire un index pour lire l'autre index afin de compter. Parfait. Il n'y a rien à ajouter.

Nous pourrions remplacer COUNT(analisi0_.ID_ANALISI) avec COUNT(*) comme le premier dit seulement "compter les enregistrements où ID_ANALISI n'est pas nul", ce qui est toujours le cas car ID_ANALISI est la clé primaire de la table. Il est donc plus simple d'utiliser ce dernier et de dire "compter les enregistrements". Cependant, je ne m'attends pas à ce que cela accélère considérablement la requête, voire pas du tout.

Donc, du point de vue de la requête, il n'y a rien pour accélérer cela. Voici d'autres choses qui me viennent à l'esprit :

  • Des tables partitionnées ? Non, je n'y verrais aucun avantage. Cela pourrait être plus rapide si la requête était exécutée dans des threads parallèles, mais pour autant que je sache, il n'y a pas d'exécution parallèle sur plusieurs partitions dans MySQL. (Je peux me tromper cependant.)
  • Défragmenter les tableaux ? Non, les tables elles-mêmes ne sont même pas accessibles dans la requête.
  • Cela nous laisse avec :Achetez du meilleur matériel. (Désolé de ne pas avoir de meilleurs conseils pour vous.)