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

Lösung zum Verhindern des Caching in Seiten

Lösung: Fügen Sie in <head> den folgenden Co...

Detaillierte Erläuterung des Mysql Self-Join-Abfragebeispiels

Dieser Artikel beschreibt die Mysql-Self-Join-Abf...

Detaillierte Erläuterung der MySQL-Cursor-Konzepte und -Verwendung

Dieser Artikel erläutert anhand von Beispielen da...

So ändern Sie die Zeit in der virtuellen CentOS-Maschine

Das obere Bild zeigt die Systemzeit und das unter...

So aktualisieren Sie die Ansicht synchron nach Datenänderungen in Vue

Vorwort Vor kurzem bin ich auf ein interessantes ...

jQuery verwendet das Canvas-Tag, um den Bestätigungscode zu zeichnen

Das <canvas>-Element ist für clientseitige ...

Details zu verschiedenen Schriftformaten in HTML-Webseiten

Dieser Abschnitt beginnt mit den Details der Text...

Drei Netzwerkmethoden und Prinzipien von virtuellen VMware-Maschinen (Zusammenfassung)

1. Brigde——Bridge: VMnet0 wird standardmäßig verw...

Umfassende Analyse von Prototypen, Prototypobjekten und Prototypketten in js

Inhaltsverzeichnis Prototypen verstehen Prototypo...

Designtheorie: Textausdruck und Benutzerfreundlichkeit

<br />Beim Textdesign konzentrieren wir uns ...

Vue implementiert Beispielcode für Links- und Rechtsgleiteffekte

Vorwort Die bei der persönlichen tatsächlichen En...

Beispiel für das Einrichten einer Whitelist in Nginx mithilfe des Geomoduls

Ursprüngliche Konfiguration: http { ...... Verbin...

Tutorial zur Installation von Ubuntu Server in Vmware

In diesem Artikel finden Sie das grafische Tutori...