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:
|
<<: Eine kurze Diskussion darüber, wie man JS Schritt für Schritt lernt
Inhaltsverzeichnis Vorwort Optionale Verkettung N...
Die Festlegung einer Begrenzung der Anzahl von Be...
Inhaltsverzeichnis 1. Dateien importieren 2. HTML...
In diesem Artikel wird der spezifische Code von j...
Einfach ausgedrückt besteht die verzögerte Replik...
Erstellen Sie eine Simulationsumgebung: Betriebss...
In diesem Artikelbeispiel wird der spezifische Co...
Vorwort Wenn der Code ausgeführt wird und ein Feh...
Inhaltsverzeichnis 1. Zeichne einen Kreis 2. Krei...
Listen werden verwendet, um eine Reihe ähnlicher o...
Ergebnis:Implementierungscode html <nav class=...
Software-Download Link zum Herunterladen der Soft...
=================================================...
Derzeit verfügt Docker über einen offiziellen Mir...
Ich habe kürzlich bei einem praktischen Trainings...