Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL zu langsam bei einfacher Abfrage zwischen zwei Tabellen

In InnoDB enthält jeder Index implizit den Primärschlüssel.

Der Erklärplan zeigt diesen Index IDX_NOME wird auf dem Tisch Paziente verwendet . Das DBMS sucht den Namen im Index und findet ID_PAZIENTE darin, das ist der Schlüssel, den wir brauchen, um auf die andere Tabelle zuzugreifen. Dem ist also nichts hinzuzufügen. (In einem anderen DBMS hätten wir einen zusammengesetzten Index zu (NOME, ID_PAZIENTE) hinzugefügt damit dies geschieht.)

Dann gibt es noch die Tabelle Analisi berücksichtigen. Wir finden einen Datensatz über FK_ANALISI_PAZIENTE die den ID_PAZIENTE enthält der verwendet wird, um die Übereinstimmung zu finden, und implizit der Primärschlüssel ID_ANALISI die für den Zugriff auf die Tabelle verwendet werden könnten, aber das ist nicht einmal notwendig, da wir alle Informationen, die wir brauchen, aus dem Index haben. Es gibt nichts mehr, was wir in der Tabelle finden müssen. (Auch hier hätten wir in einem anderen DBMS einen zusammengesetzten Index zu (ID_PAZIENTE, ID_ANALISI) hinzugefügt um einen abdeckenden Index zu haben.)

Was also passiert, ist nur:einen Index lesen, um den anderen Index zu lesen, um zu zählen. Perfekt. Dem ist nichts hinzuzufügen.

Wir könnten ersetzen Sie COUNT(analisi0_.ID_ANALISI) mit COUNT(*) wie ersteres nur sagt "Zähle Datensätze wo ID_ANALISI ist nicht null", was als ID_ANALISI immer der Fall ist ist der Primärschlüssel der Tabelle. Es ist also einfacher, letzteres zu verwenden und "Datensätze zählen" zu sagen. Ich erwarte jedoch nicht, dass dies die Abfrage wesentlich beschleunigt, wenn überhaupt.

Aus Abfragesicht gibt es also nichts, was dies beschleunigen könnte. Hier sind weitere Dinge, die mir einfallen:

  • Partitionierte Tabellen? Nein, ich würde darin keinen Vorteil sehen. Es könnte schneller sein, wenn die Abfrage dann in parallelen Threads ausgeführt würde, aber meines Wissens gibt es in MySQL keine parallele Ausführung auf mehreren Partitionen. (Ich kann mich aber irren.)
  • Tabellen defragmentieren? Nein, auf die Tabellen selbst wird in der Abfrage nicht einmal zugegriffen.
  • Da bleibt uns nur noch:Bessere Hardware kaufen. (Leider habe ich keinen besseren Rat für Sie.)