Tipps zur MySql-SQL-Optimierung teilen

Tipps zur MySql-SQL-Optimierung teilen

Eines Tages stellte ich fest, dass die Ausführungsgeschwindigkeit einer SQL-Anweisung mit Inner Join nicht sehr langsam war (0,1–0,2), aber nicht die ideale Geschwindigkeit erreichte. Die beiden Tabellen sind verknüpft, und die verknüpften Felder sind Primärschlüssel und die abgefragten Felder sind eindeutige Indizes.

Das SQL lautet wie folgt:

WÄHLEN
p_item_token.*,
p_item.produkt_typ
AUS
p_item_token
INNER JOIN p_item ON p_item.itemid = p_item_token.itemid
WO
p_item_token.token = "db87a780427d4d02ba2bd49fac8xxx";

In der Tabelle p_item_token ist itemid der Primärschlüssel und token der eindeutige Index. itemid in p_item ist der Primärschlüssel

Sie sollte idealerweise bei ca. 0,03 s liegen. Der tatsächliche Wert liegt jedoch bei etwa 0,2, was viel langsamer ist.

Direktes EXPLAIN, um den Plan anzuzeigen

ERKLÄREN
WÄHLEN
  p_item_token.*,
  p_item.produkt_typ
AUS
  p_item_token
INNER JOIN p_item ON p_item.itemid = p_item_token.itemid
WO
  p_item_token.token = "db87a780427d4d02ba2bd49fac8xxx";

Ergebnis:

Achten Sie auf das große rote Kästchen oben. Die Tabelle p_item enthält 20.000 Datensätze. Es handelt sich also um einen vollständigen Tabellenscan.

Das ist nicht normal.

Fügen Sie Show-Warnungen hinzu und sehen Sie nach. Hinweis: In manchen Fällen hat „WARNUNGEN ANZEIGEN“ keine Wirkung. Den Grund kenne ich noch nicht. Es wird empfohlen, mit einer lokalen Testdatenbank zu arbeiten.

ERKLÄREN
WÄHLEN
  p_item_token.*,
  p_item.produkt_typ
AUS
  p_item_token
INNER JOIN p_item ON p_item.itemid = p_item_token.itemid
WO
  p_item_token.token = "db87a780427d4d02ba2bd49fac8xxx";
WARNUNGEN ANZEIGEN; 

Ergebnis 2 zeigt Code=1003. Dahinter verbirgt sich ein SQL-Statement. Diese Anweisung ist die letzte Anweisung, die von MySQL ausgeführt wird, nachdem die von uns eingegebene SQL-Anweisung entsprechend den Regeln umgeschrieben wurde.

/* Auswahl#1 */
WÄHLEN
  '0000eb612d78407a91a9b3854ffffffff' AS `itemid`, /*Hinweis: Drücken Sie direkt die Primärtaste, um den Wert zu finden*/
  'db87a780427d4d02ba2bd49fac8cf98b' ALS `Token`,    
  '2016-12-16 10:46:53' als `create_time`,        
  '' ALS `ftoken`,                    
  `p_db`.`p_item`.`Produkttyp` AS `Produkttyp`  
AUS
  `p_db`.`p_item_token`
JOIN `p_db`.`p_item`
WO
  (
    (
      KONVERTIEREN (
        `p_db`.`p_item`.`itemid` MIT utf8mb4
      ) = '0000eb612d78407a91a9b3854fffffff'
    )
  )

Das ist seltsam. Warum steht in „Wo“ ein „CONVERT“? Wir wissen, dass es zu Verlangsamung kommt, wenn sich in der Where-Bedingung eine Funktion auf der linken Seite der Gleichung befindet, also im abzufragenden Feld. (Mein Verständnis: Es ist langsam, weil der Index nicht verwendet wird. Der Wert des Index ist der ursprüngliche Wert, aber der in diesem Zustand verwendete Wert ist der verarbeitete Wert.)

Beachten Sie, dass diese Funktion die Kodierung der Spalte itemid in utf8mb4 konvertiert. Mit anderen Worten: Die Kodierung dieser Spalte ist nicht utf8mb4!

Öffnen Sie die Tabelle und ändern Sie die Kodierung der ItemID-Spalte in beiden Tabellen in UTF8. Führen Sie die Erklärung noch einmal aus.

Es gibt kein Problem bei der Erklärung der Ergebnisse.

Schauen Sie sich die Aussage in Ergebnis 2 an:

/* Auswahl#1 */
WÄHLEN
  '0000eb612d78407a91a9b3854fffffff' als `itemid`,
  'db87a780427d4d02ba2bd49fac8cf98b' ALS `Token`,
  '2016-12-16 10:46:53' als `create_time`,
  '' ALS `ftoken`,
  „cxx“ AS „Produkttyp“
AUS
  `Spielzeugartikelplatine`.`p_Artikeltoken`
JOIN `toy_item_plat`.`p_item`
WO
  1

Diese Auswahl ist voller Konstanten. Wie kann es langsam sein?

Ausführungsergebnis: 0,036 s. Erfüllt die Erwartungen

Erkenntnisse:

Explain kann überprüfen, ob der Ausführungsplan den Erwartungen entspricht. Wenn große Zeilen vorhanden sind, bedeutet dies, dass ein vollständiger Tabellenscan aufgetreten ist, der in Zukunft zu einem Leistungsengpass wird.

Wenn Sie den Befehl „show warning“ verwenden, können Sie die vom Optimierer verarbeiteten Anweisungen sehen. Wenn es Unstimmigkeiten mit der ursprünglichen Aussage gibt, kann ein sorgfältiger Vergleich und eine sorgfältige Untersuchung das eigentliche Problem aufdecken.

Das könnte Sie auch interessieren:
  • Allgemeine Download-, Installations- und Konfigurationsmethoden und einfache Bedienungskenntnisse für MySQL 5.7.20 (kostenlose Installation der Dekomprimierungsversion)
  • So verwenden Sie Java Web zum Herstellen einer Verbindung zur MySQL-Datenbank
  • So verwenden Sie tcpdump zum Erfassen von Paketen für MySQL
  • Detaillierte Erläuterung von 30 SQL-Abfrageoptimierungstechniken für MySQL-Zehnmillionen großer Datenmengen
  • Mysql-Optimierungstechniken zum Abfragen von Daten basierend auf der Zeit
  • 10 SQL-Anweisungsoptimierungstechniken zur Verbesserung der MySQL-Abfrageeffizienz
  • MySQL-Techniken zum schnellen Datenvergleich
  • Zusammenfassung häufiger Probleme und Anwendungskenntnisse in MySQL
  • 5 Tipps zum Schutz Ihres MySQL Data Warehouse
  • Teilen Sie 101 MySQL-Debugging- und Optimierungstipps
  • Zusammenfassung der MySQL-Injection-Bypass-Filtertechniken
  • Zusammenfassung der allgemeinen Bedienungskenntnisse der MySQL-Datenbank

<<:  Vue-Ereignisparameter $event = Ereigniswertfall

>>:  Einführung in den Swap-Speicher des Linux-Systems

Artikel empfehlen

React implementiert eine hochadaptive virtuelle Liste

Inhaltsverzeichnis Vor der Transformation: Nach d...

MySQL-Reihe von Erfahrungszusammenfassungen und Analyse-Tutorials zu NULL-Werten

Inhaltsverzeichnis 1. Testdaten 2. Die Unannehmli...

HTML realisiert Hotel-Screening-Funktion über Formular

<!doctype html> <html xmlns="http:/...

Informationen zur Verwendung der Vue v-on-Direktive

Inhaltsverzeichnis 1. Auf Ereignisse achten 2. Üb...

Windows 2019 Aktivierungs-Tutorial (Office2019)

Vor ein paar Tagen habe ich erfahren, dass die of...

Detaillierte Erklärung zur Verwendung von Filtereigenschaften in CSS

Das Filterattribut definiert die visuelle Wirkung...

So verwenden Sie CSS-Zähler, um geordnete Zahlenlisten zu verschönern

Beim Webdesign ist es sehr wichtig, eine organisi...