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

Eine kurze Diskussion über 3 bemerkenswerte neue Features in TypeScript 3.7

Inhaltsverzeichnis Vorwort Optionale Verkettung N...

js realisiert das Verpacken mehrerer Bilder in Zip

Inhaltsverzeichnis 1. Dateien importieren 2. HTML...

js, um die Rotation von Webseitenbildern zu realisieren

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

So aktivieren Sie die JMX-Überwachung über Tomcat

Erstellen Sie eine Simulationsumgebung: Betriebss...

jQuery implementiert gleitende Registerkarte

In diesem Artikelbeispiel wird der spezifische Co...

So drucken Sie hervorgehobenen Code in der Node.JS-Konsole

Vorwort Wenn der Code ausgeführt wird und ein Feh...

XHTML-Einführungstutorial: Verwendung von Listen-Tags

Listen werden verwendet, um eine Reihe ähnlicher o...

Horizontales Header-Menü mit CSS3 implementiert

Ergebnis:Implementierungscode html <nav class=...

Diagramm zur Installation von VMware 14 unter Windows 10

Software-Download Link zum Herunterladen der Soft...

Häufige Fehler und Gründe für MySQL-Verbindungsfehler

=================================================...

Lösung für das Problem der langsamen Docker-Pull-Image-Geschwindigkeit

Derzeit verfügt Docker über einen offiziellen Mir...