Lösung für Indexfehler in MySQL aufgrund unterschiedlicher Feldzeichensätze

Lösung für Indexfehler in MySQL aufgrund unterschiedlicher Feldzeichensätze

Was ist ein Index? Warum einen Index erstellen?

Indizes werden verwendet, um schnell Zeilen zu finden, die einen bestimmten Wert in einer Spalte haben. Ohne Index muss MySQL die gesamte Tabelle ab dem ersten Datensatz lesen, bis es die relevante Zeile findet. Je größer die Tabelle, desto länger dauert die Datenabfrage. Wenn die abgefragte Spalte in der Tabelle einen Index hat, kann MySQL schnell einen Ort erreichen, um die Datendatei zu durchsuchen, ohne alle Daten durchsuchen zu müssen, was viel Zeit spart.

Beispielsweise gibt es eine Personentabelle mit 20.000 Datensätzen, in der die Informationen zu 20.000 Einzelpersonen erfasst sind. Es gibt ein Telefonfeld, in dem die Telefonnummer jeder Person aufgezeichnet wird. Jetzt möchten wir die Informationen der Person abfragen, deren Telefonnummer xxxx ist.

Wenn kein Index vorhanden ist, wird die Tabelle vom ersten Datensatz zum nächsten Datensatz durchlaufen, bis die Informationen gefunden werden.

Wenn ein Index vorhanden ist, wird das Feld „Telefon“ auf eine bestimmte Weise gespeichert, sodass beim Abfragen der Informationen zu diesem Feld die entsprechenden Daten schnell gefunden werden können, ohne 20.000 Datensätze durchsuchen zu müssen. Es gibt zwei Arten der Indexspeicherung in MySQL: BTREE und HASH. Das heißt, verwenden Sie einen Baum oder einen Hash-Wert, um das Feld zu speichern. Um zu wissen, wie Sie im Detail suchen, müssen Sie den Algorithmus kennen. Jetzt müssen wir nur noch die Rolle und Funktion des Index kennen.

Einführung

Ich habe heute eine SQL-Anweisung geschrieben. Die Datenmenge in den beteiligten Tabellen betrug etwa 500.000. Die Abfrage dauerte 8 Sekunden. Dies sind nur Daten vom Testserver. Wenn es auf den offiziellen Server gestellt wird, stürzt es definitiv ab, sobald es ausgeführt wird.

WÄHLEN
 Bestellungen. NEIN,
 Guid Nein,
 Bestellungen.Erstellungszeit,
 Summe(Bestellposition.Menge) AS Menge,
 Markenname als Markenname,
 Mitglied.Mobile,
 Straße und Hausnummer der Lieferadresse,
 Bereich
AUS
 Bestellungen
INNER JOIN OrderItem ON Orders.GuidNo = OrderItem.OrderGuidNo
INNER JOIN Marke ON Marke.Id = Bestellungen.MarkenId
INNER JOIN-Mitglied ON Mitglied.Id = 13
INNER JOIN Mitgliedsadresse ON Mitglied.Id = Mitgliedsadresse.MemberId
WO
 Bestellungen.GuidNo IN (
  WÄHLEN
   Bestellzahlung.OrderGuidNo
  AUS
   Zahlungsbeleg
  LEFT JOIN orderpayment ON Zahlungsdatensatz.`Nein` = orderpayment.ZahlungsNr
  WO
   Zahlungsdatensatz.Zahlungsmethode = "Mitgliedskarte"
  UND Zahlungsdatensatz.Zahler = 13
 )
GRUPPELN NACH
 GuidNr;

Dann habe ich es mit EXPLAIN analysiert und festgestellt, dass die Tabelle „Orders“ den Index nicht gefunden hat. Der Index war zwar für die GuidNo in „Orders“ festgelegt, konnte aber nicht gefunden werden.

Lösungsprozess

Dann habe ich die obige Aussage in zwei Aussagen aufgeteilt. Ändern Sie zunächst die SQL-Anweisung wie folgt: Schreiben Sie die Unterabfragedaten direkt in die SQL-Anweisung, und die Abfrage dauert 0,12 Sekunden.

WÄHLEN
 Bestellungen. NEIN,
 Guid Nein,
 Bestellungen.Erstellungszeit,
 Summe(Bestellposition.Menge) AS Menge,
 Markenname als Markenname,
 Mitglied.Mobile,
 Straße und Hausnummer der Lieferadresse,
 Bereich
AUS
 Bestellungen
INNER JOIN OrderItem ON Orders.GuidNo = OrderItem.OrderGuidNo
INNER JOIN Marke ON Marke.Id = Bestellungen.MarkenId
INNER JOIN-Mitglied ON Mitglied.Id = 13
INNER JOIN Mitgliedsadresse ON Mitglied.Id = Mitgliedsadresse.MemberId
WO
 Bestellungen.GuidNo IN (
  '0A499C5B1A82B6322AE99D107D4DA7B8',
  '18A5EE6B1D4E9D76B6346D2F6B836442',
  '327A5AE2BACEA714F8B907865F084503',
  'B42B085E794BA14516CE21C13CF38187',
  'FBC978E1602ED342E5567168E73F0602'
 )
GRUPPELN NACH
 Guid-Nr

Zweitens: Das SQL, das die Unterabfrage alleine ausführt, dauert ebenfalls nur 0,1 Sekunden

WÄHLEN
   Bestellzahlung.OrderGuidNo
  AUS
   Zahlungsbeleg
  LEFT JOIN orderpayment ON Zahlungsdatensatz.`Nein` = orderpayment.ZahlungsNr
  WO
   Zahlungsdatensatz.Zahlungsmethode = "Mitgliedskarte"
  UND Zahlungsdatensatz.Zahler = 13

Jetzt ist das Problem klar. Es muss ein Problem mit der Unterabfrage und der übergeordneten Abfrage sein. Da die Unterabfrage sehr schnell ist, wenn sie allein steht, ist die übergeordnete Abfrage auch sehr schnell, wenn sie die Daten der Unterabfrage direkt verwendet. Sie ist jedoch sehr langsam, wenn beide kombiniert werden. Das Problem lässt sich grob auf die beiden zugehörigen Felder OrderGuidNo zurückführen.

Schließlich stellt sich heraus, dass die Zeichensätze der Orderpayment-Tabelle und der Orders-Tabelle unterschiedlich sind. Der Zeichensatz einer Tabelle ist: utf8_general_ci, und der der anderen: utf8mb4_general_ci. (Sie wissen es nicht, bis Sie es überprüfen. Sie stellen fest, dass in einer Datenbank viele Tabellen unterschiedliche Zeichensätze haben.)

Ändern Sie den Zeichensatz der Orderpayment-Tabelle und den Zeichensatz von OrderGuidNo in der Tabelle in: utf8_general_ci

ALTER TABLE orderpayment DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; //Den Zeichensatz der Tabelle ändern ALTER TABLE orderpayment CHANGE OrderGuidNo OrderGuidNo VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci; //Den Zeichensatz des Felds ändern

Verwenden Sie dann EXPLAIN zur Analyse und Sie können sehen, dass die Indizes verwendet werden.

Anschließend ausführen, die Abfrage dauerte 0,112 Sekunden.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Tutorial zum Anzeigen und Ändern von MySQL-Zeichensätzen
  • So ändern Sie den MySQL-Zeichensatz
  • Ursachen und Lösungen für das Problem des verstümmelten Zeichensatzes in der MySQL-Datenbank
  • So ändern Sie den MySQL-Zeichensatz utf8 in utf8mb4
  • So vereinheitlichen Sie den Zeichensatz einer vorhandenen MySQL-Datenbank
  • Verstümmelte Zeichen und Lösungen im MySQL-Zeichensatz
  • Detaillierte Erläuterung der JDBC-Verarbeitung des Mysql utf8mb4-Zeichensatzes
  • So ändern Sie den Standardzeichensatz von MySQL auf dem MAC auf UTF-8
  • So legen Sie den Zeichensatz für MySQL unter Docker fest
  • So lösen Sie das Problem der Nichtübereinstimmung des MySQL-Abfragezeichensatzes
  • Detaillierte Erklärung der Zeichensätze und Validierungsregeln in MySQL

<<:  Eine kurze Diskussion darüber, wie man JS Schritt für Schritt lernt

>>:  Detaillierte Erläuterung des Konfigurationsprozesses des logischen Linux-LVM-Volumes (Erstellen, Erhöhen, Reduzieren, Löschen, Deinstallieren)

Artikel empfehlen

Grafische Einführung in den Unterschied zwischen := und = in MySQL

Der Unterschied zwischen := und = = Nur beim Setz...

So kommunizieren Sie mit anderen Benutzern über die Linux-Befehlszeile

Es ist ganz einfach, Nachrichten an andere Benutz...

So verwenden Sie Standardwerte für Variablen in SASS

Bei in SASS definierten Variablen überschreibt de...

So installieren Sie mysql5.6 in Docker unter Ubuntu

1. Installieren Sie mysql5.6 Docker führt MySQL a...

So verwenden Sie den CocosCreator-Objektpool

Inhaltsverzeichnis Vorwort: Spezifische Operation...

Reduzieren Sie die Speicher- und CPU-Auslastung durch die Optimierung von Webseiten

Manche Webseiten erscheinen möglicherweise nicht g...

JavaScript zum Erzielen eines Vollbild-Seiten-Scrolleffekts

Nachdem ich mit der Lektüre von JavaScript DOM fe...

Reacts Übergang von Klassen zu Hooks

Inhaltsverzeichnis ReagierenHooks Vorwort WarumHo...

Grundlegendes Tutorial zur Bedienung von Dateien und Berechtigungen in CentOS

Vorwort Bevor wir beginnen, sollten wir uns kurz ...

js, um eine einfache Lotteriefunktion zu erreichen

In diesem Artikel wird der spezifische Code von j...