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

MySql-Abfrage sehr langsam

Der Leistungsunterschied ist möglicherweise wegen e.id_dernier_fichier in dem für den JOIN verwendeten Index, aber e.codega nicht darin zu sein index.

Ohne eine vollständige Definition beider Tabellen und aller ihrer Indizes ist es nicht möglich, dies mit Sicherheit zu sagen. Außerdem wäre es hilfreich, die beiden EXPLAIN PLANs für die beiden Abfragen beizufügen.


Im Moment kann ich jedoch auf ein paar Dinge näher eingehen ...

Wenn ein INDEX CLUSTERED ist (dies gilt auch für PRIMARY KEYs), werden die Daten tatsächlich physikalisch in der Reihenfolge des INDEX gespeichert. Das bedeutet, dass Sie wissen, dass Sie Position x wollen im INDEX bedeutet auch Implizitheit, dass Sie Position x wollen in der TABELLE.

Wenn der INDEX jedoch nicht geclustert ist, stellt der INDEX nur eine Suche für Sie bereit. Effektiv sagen Position x im INDEX entspricht Position y in der TABELLE.

Wichtig hierbei ist der Zugriff auf Felder, die nicht im INDEX angegeben sind. Dies bedeutet, dass Sie tatsächlich zur TABELLE gehen müssen, um die Daten abzurufen. Im Fall eines CLUSTERED INDEX sind Sie bereits dort, der Aufwand für die Suche nach diesem Feld ist ziemlich gering. Wenn der INDEX jedoch nicht geclustert ist, müssen Sie die TABELLE effektiv mit dem INDEX VERKNÜPFEN und dann das Feld finden, an dem Sie interessiert sind.


Notiz; Einen zusammengesetzten Index auf (id_dernier_fichier, codega) haben unterscheidet sich sehr davon, einen Index nur für (id_dernier_fichier) zu haben und ein separater Index nur für (codega) .


Im Fall Ihrer Anfrage müssen Sie den Code meiner Meinung nach überhaupt nicht ändern. Aber Sie können profitieren von der Änderung der Indizes.

Sie erwähnen, dass Sie auf viele zugreifen möchten Felder. All diese Felder in einen zusammengesetzten Index zu packen, ist wahrscheinlich nicht die beste Lösung. Stattdessen möchten Sie vielleicht einen CLUSTERED INDEX auf (id_dernier_fichier) erstellen . Das bedeutet, dass Sie, sobald *id_dernier_fichier* gefunden wurde, bereits an der richtigen Stelle sind, um auch alle anderen Felder zu erhalten.


BEARBEITEN Hinweis zu MySQL und CLUSTERED INDEXEN

13.2.10.1. Geclusterte und sekundäre Indizes

Jede InnoDB-Tabelle hat einen speziellen Index namens Clustered Index, in dem die Daten für die Zeilen gespeichert werden:

  • Wenn Sie einen PRIMARY KEY für Ihre Tabelle definieren, verwendet InnoDB ihn als Clustered-Index.
  • Wenn Sie keinen PRIMARY KEY für Ihre Tabelle definieren, wählt MySQL den ersten UNIQUE-Index, der nur NOT NULL-Spalten als Primärschlüssel enthält, und InnoDB verwendet ihn als Clustered-Index.
  • Wenn die Tabelle keinen PRIMARY KEY oder geeigneten UNIQUE-Index hat, generiert InnoDB intern einen versteckten Clustered-Index für eine synthetische Spalte, die Zeilen-ID-Werte enthält. Die Zeilen werden nach der ID sortiert, die InnoDB den Zeilen in einer solchen Tabelle zuweist. Die Zeilen-ID ist ein 6-Byte-Feld, das monoton zunimmt, wenn neue Zeilen eingefügt werden. Somit befinden sich die nach der Zeilen-ID geordneten Zeilen physisch in der Reihenfolge der Einfügung.