Schauen wir uns zunächst eine Kastanie an EXPLAIN: Wählen Sie * aus Mitarbeitern aus, bei denen Name > „a“ ist. Wenn Sie den Namensindex zum Suchen nach Daten verwenden, müssen Sie den gemeinsamen Indexbaum des Namensfelds durchlaufen und dann den durchlaufenen Primärschlüsselwert verwenden, um die endgültigen Daten im Primärschlüsselindexbaum zu finden. Der Aufwand ist höher als beim Scannen der gesamten Tabelle. Sie können die abdeckende Indexoptimierung verwenden, sodass Sie nur den gemeinsamen Indexbaum des Namensfelds durchlaufen müssen, um alle Ergebnisse zu erhalten. EXPLAIN: Wählen Sie Name, Alter und Position aus den Mitarbeitern aus, bei denen Name > „a“ ist. Es ist ersichtlich, dass die ausgewählten Felder Indizes abdecken und MySQL auf der untersten Ebene eine Indexoptimierung verwendet. Betrachten wir einen anderen Fall: EXPLAIN wählen Sie * aus Mitarbeitern, bei denen Name > ‚zzz‘ ist; Ob MySQL bei den beiden obigen Ausführungsergebnissen von Name>'a' und Name>'zzz' letztendlich den Index verwendet oder eine Tabelle mehrere Indizes enthält, und wie MySQL letztendlich den Index auswählt, können Sie mit dem Trace-Tool überprüfen. Das Aktivieren des Trace-Tools wirkt sich auf die MySQL-Leistung aus, sodass es nur zur vorübergehenden Analyse der SQL-Nutzung verwendet werden kann und sofort nach der Verwendung geschlossen werden muss. SET SESSION optimizer_trace="enabled=on",end_markers_in_json=on; -- Ablaufverfolgung aktivieren SELECT * FROM Mitarbeiter WHERE Name > 'a' ORDER BY Position; WÄHLEN SIE * AUS information_schema.OPTIMIZER_TRACE; Schauen Sie sich das Trace-Feld an: { "Schritte": [ { "join_preparation": { --Erste Phase: SQL-Vorbereitungsphase "select#": 1, "Schritte": [ { "expanded_query": "/* select #1 */ select `employees`.`id` AS `id`,`employees`.`name` AS `name`,`employees`.`age` AS `age`,`employees`.`position` AS `position`,`employees`.`hire_time` AS `hire_time` from `employees` where (`employees`.`name` > 'a') sortiere nach `employees`.`position`" } ] /* Schritte */ } /* Beitrittsvorbereitung */ }, { "join_optimization": { --Zweite Phase: SQL-Optimierungsphase "select#": 1, "Schritte": [ { "Bedingungsverarbeitung": { --Bedingungsverarbeitung "Bedingung": "WO", "original_condition": "(`employees`.`name` > 'a')", "Schritte": [ { "Transformation": "Gleichheitsausbreitung", "resultierende_Bedingung": "(`Mitarbeiter`.`Name` > 'a')" }, { "Transformation": "konstante_Ausbreitung", "resultierende_Bedingung": "(`Mitarbeiter`.`Name` > 'a')" }, { "Transformation": "triviale_Bedingung_Entfernung", "resultierende_Bedingung": "(`Mitarbeiter`.`Name` > 'a')" } ] /* Schritte */ } /* Bedingungsverarbeitung */ }, { "table_dependencies": [ -- Details der Tabellenabhängigkeit { "Tabelle": "`Mitarbeiter`", "row_may_be_null": falsch, "map_bit": 0, "hängt von Kartenbits ab": [ ] /* hängt von Kartenbits ab */ } ] /* Tabellenabhängigkeiten */ }, { "ref_optimizer_key_uses": [ ] /* ref_optimizer_key_uses */ }, { "rows_estimation": [ --Geschätzte Zielzugriffskosten { "Tabelle": "`Mitarbeiter`", "Bereichsanalyse": { "table_scan": { --Vollständiger Tabellenscan "rows": 3, --Anzahl der gescannten Zeilen "cost": 3,7 --Abfragekosten} /* table_scan */, "potential_range_indices": [ --Frage die möglichen zu verwendenden Indizes ab { "index": "PRIMARY", --Primärschlüsselindex "usable": false, "Ursache": "nicht zutreffend" }, { "index": "idx_name_age_position", -- Hilfsindex "verwendbar": true, "Schlüsselteile": [ "Name", "Alter", "Position", "Ausweis" ] /* Schlüsselteile */ }, { "index": "idx_age", "verwendbar": falsch, "Ursache": "nicht zutreffend" } ] /* potentielle_Bereichsindizes */, "setup_range_conditions": [ ] /* Bereichsbedingungen einrichten */, "Gruppenindexbereich": { "ausgewählt": falsch, "Ursache": "nicht_gruppiert_nach_oder_unterscheidbar" } /* Gruppenindexbereich */, "analyzing_range_alternatives": { ‐‐Analysieren Sie die Kosten der Verwendung jedes Indexes "range_scan_alternatives": [ { "Index": "idx_name_age_position", "Bereiche": [ "ein < Name" ] /* Bereiche */, "index_dives_for_eq_ranges": wahr, "rowid_ordered": falsch, "using_mrr": falsch, „index_only“: false, – ob der abdeckende Index verwendet werden soll. „rows“: 3, – Anzahl der Zeilen, die nach dem Index durchsucht werden sollen. „cost“: 4,61, – Kosten für die Indexnutzung. „chosen“: false, – ob dieser Index ausgewählt werden soll. „cause“: „cost“ } ] /* Bereichsscan-Alternativen */, "analyzing_roworder_intersect": { "verwendbar": falsch, "Ursache": "zu wenige Zeilenreihenfolgescans" } /* Analysieren der Zeilenreihenfolge */ } /* Analysebereichsalternativen */ } /* Bereichsanalyse */ } ] /* Zeilenschätzung */ }, { "überlegte_Ausführungspläne": [ { "plan_prefix": [ ] /* Planpräfix */, "Tabelle": "`Mitarbeiter`", "bester_Zugriffspfad": { "berücksichtigte Zugriffspfade": [ { "Zugriffstyp": "Scannen", "Zeilen": 3, "Kosten": 1,6, "ausgewählt": wahr, "use_tmp_table": wahr } ] /* berücksichtigte Zugriffspfade */ } /* bester_Zugriffspfad */, "Kosten für Plan": 1,6, "Zeilen für Plan": 3, "Sortierkosten": 3, "neue_Kosten_für_Plan": 4,6, "ausgewählt": wahr } ] /* berücksichtigte_Ausführungspläne */ }, { "Bedingungen an Tabellen anhängen": { "original_condition": "(`employees`.`name` > 'a')", "angehängte_Bedingungen_Berechnung": [ ] /* Berechnung der angehängten Bedingungen */, "Zusammenfassung der angehängten Bedingungen": [ { "Tabelle": "`Mitarbeiter`", "angehängt": "(`Mitarbeiter`.`Name` > 'a')" } ] /* Zusammenfassung der angehängten Bedingungen */ } /* Bedingungen an Tabellen anhängen */ }, { "Klauselverarbeitung": { "Klausel": "ORDER BY", "original_clause": "`Mitarbeiter`.`Position`", "Artikel": [ { "item": "`Mitarbeiter`.`Position`" } ] /* Artikel */, "resulting_clause_is_simple": wahr, "resulting_clause": "`Mitarbeiter`.`Position`" } /* Klauselverarbeitung */ }, { "Plan verfeinern": [ { "Tabelle": "`Mitarbeiter`", "Zugriffstyp": "Tabellenscan" } ] /* Verfeinerungsplan */ }, { "Zugriffspfade für die Indexreihenfolge überdenken": { "Klausel": "ORDER BY", "index_order_summary": { "Tabelle": "`Mitarbeiter`", "index_provides_order": falsch, "order_direction": "nicht definiert", "index": "unbekannt", "plan_changed": falsch } /* Index-Bestellübersicht */ } /* Überdenken der Zugriffspfade für die Indexreihenfolge */ } ] /* Schritte */ } /* Join-Optimierung */ }, { "join_execution": { --Phase 3: SQL-Ausführungsphase "select#": 1, "Schritte": [ { "Dateisortierinformation": [ { "Richtung": "aufwärts", "Tabelle": "`Mitarbeiter`", "Feld": "Position" } ] /* Dateisortierinformation */, "Dateisortierprioritätswarteschlangenoptimierung": { "verwendbar": falsch, "Ursache": "nicht anwendbar (kein LIMIT)" } /* Optimierung der Dateisortierprioritätswarteschlange */, "filesort_execution": [ ] /* Dateisortierausführung */, "Dateisortierungszusammenfassung": { "Zeilen": 3, "untersuchte Zeilen": 3, "Anzahl temporärer Dateien": 0, "Sortierungspuffergröße": 200704, "Sortiermodus": "<Sortierschlüssel, Zusatzfelder>" } /* Dateisortierzusammenfassung */ } ] /* Schritte */ } /* Ausführung_verbinden */ } ] /* Schritte */ } Die Kosten für einen vollständigen Tabellenscan sind geringer als für einen Indexscan. Daher wird MySQL sich letztendlich für einen vollständigen Tabellenscan entscheiden. SELECT * FROM Mitarbeiter WHERE Name > ‚zzz‘ ORDER BY Position; WÄHLEN SIE * AUS information_schema.OPTIMIZER_TRACE; { "Schritte": [ { "Beitrittsvorbereitung": { "Auswahl#": 1, "Schritte": [ { "expanded_query": "/* wähle #1 */ wähle `employees`.`id` AS `id`,`employees`.`name` AS `name`,`employees`.`age` AS `age`,`employees`.`position` AS `position`,`employees`.`hire_time` AS `hire_time` aus `employees`, wobei (`employees`.`name` > 'zzz') sortiere nach `employees`.`position`" } ] /* Schritte */ } /* Beitrittsvorbereitung */ }, { "join_optimization": { "Auswahl#": 1, "Schritte": [ { "Zustandsverarbeitung": { "Bedingung": "WO", "original_condition": "(`Mitarbeiter`.`Name` > 'zzz')", "Schritte": [ { "Transformation": "Gleichheitsausbreitung", "resultierende_Bedingung": "(`Mitarbeiter`.`Name` > 'zzz')" }, { "Transformation": "konstante_Ausbreitung", "resultierende_Bedingung": "(`Mitarbeiter`.`Name` > 'zzz')" }, { "Transformation": "triviale_Bedingung_Entfernung", "resultierende_Bedingung": "(`Mitarbeiter`.`Name` > 'zzz')" } ] /* Schritte */ } /* Bedingungsverarbeitung */ }, { "Tabellenabhängigkeiten": [ { "Tabelle": "`Mitarbeiter`", "row_may_be_null": falsch, "map_bit": 0, "hängt von Kartenbits ab": [ ] /* hängt von Kartenbits ab */ } ] /* Tabellenabhängigkeiten */ }, { "ref_optimizer_key_uses": [ ] /* ref_optimizer_key_uses */ }, { "Zeilenschätzung": [ { "Tabelle": "`Mitarbeiter`", "Bereichsanalyse": { "Tabellenscan": { "Zeilen": 3, "Kosten": 3,7 } /* Tabellenscan */, "potenzielle_Bereichsindizes": [ { "index": "PRIMÄR", "verwendbar": falsch, "Ursache": "nicht zutreffend" }, { "Index": "idx_name_age_position", "verwendbar": wahr, "Schlüsselteile": [ "Name", "Alter", "Position", "Ausweis" ] /* Schlüsselteile */ }, { "index": "idx_age", "verwendbar": falsch, "Ursache": "nicht zutreffend" } ] /* potentielle_Bereichsindizes */, "setup_range_conditions": [ ] /* Bereichsbedingungen einrichten */, "Gruppenindexbereich": { "ausgewählt": falsch, "Ursache": "nicht_gruppiert_nach_oder_unterscheidbar" } /* Gruppenindexbereich */, "Analysebereich_Alternativen": { "Bereichsscan-Alternativen": [ { "Index": "idx_name_age_position", "Bereiche": [ "zzz < Name" ] /* Bereiche */, "index_dives_for_eq_ranges": wahr, "rowid_ordered": falsch, "using_mrr": falsch, "index_only": falsch, "Zeilen": 1, "Kosten": 2,21, "ausgewählt": wahr } ] /* Bereichsscan-Alternativen */, "analyzing_roworder_intersect": { "verwendbar": falsch, "Ursache": "zu wenige Zeilenreihenfolgescans" } /* Analysieren der Zeilenreihenfolge */ } /* Analysebereichsalternativen */, "Zusammenfassung des ausgewählten Zugriffsbereichs": { "Bereichszugriffsplan": { "Typ": "Bereichsscan", "Index": "idx_name_age_position", "Zeilen": 1, "Bereiche": [ "zzz < Name" ] /* Bereiche */ } /* Bereichszugriffsplan */, "Zeilen für Plan": 1, "Kosten für Plan": 2,21, "ausgewählt": wahr } /* Zusammenfassung des Zugriffs auf den gewählten Bereich */ } /* Bereichsanalyse */ } ] /* Zeilenschätzung */ }, { "überlegte_Ausführungspläne": [ { "plan_prefix": [ ] /* Planpräfix */, "Tabelle": "`Mitarbeiter`", "bester_Zugriffspfad": { "berücksichtigte Zugriffspfade": [ { "Zugriffstyp": "Bereich", "Zeilen": 1, "Kosten": 2,41, "ausgewählt": wahr, "use_tmp_table": wahr } ] /* berücksichtigte Zugriffspfade */ } /* bester_Zugriffspfad */, "Kosten für Plan": 2,41, "Zeilen für Plan": 1, "Sortierkosten": 1, "neue_Kosten_für_Plan": 3,41, "ausgewählt": wahr } ] /* berücksichtigte_Ausführungspläne */ }, { "Bedingungen an Tabellen anhängen": { "original_condition": "(`Mitarbeiter`.`Name` > 'zzz')", "angehängte_Bedingungen_Berechnung": [ ] /* Berechnung der angehängten Bedingungen */, "Zusammenfassung der angehängten Bedingungen": [ { "Tabelle": "`Mitarbeiter`", "angehängt": "(`Mitarbeiter`.`Name` > 'zzz')" } ] /* Zusammenfassung der angehängten Bedingungen */ } /* Bedingungen an Tabellen anhängen */ }, { "Klauselverarbeitung": { "Klausel": "ORDER BY", "original_clause": "`Mitarbeiter`.`Position`", "Artikel": [ { "item": "`Mitarbeiter`.`Position`" } ] /* Artikel */, "resulting_clause_is_simple": wahr, "resulting_clause": "`Mitarbeiter`.`Position`" } /* Klauselverarbeitung */ }, { "Plan verfeinern": [ { "Tabelle": "`Mitarbeiter`", "pushed_index_condition": "(`Mitarbeiter`.`Name` > 'zzz')", "table_condition_attached": null, "Zugriffstyp": "Bereich" } ] /* Verfeinerungsplan */ }, { "Zugriffspfade für die Indexreihenfolge überdenken": { "Klausel": "ORDER BY", "index_order_summary": { "Tabelle": "`Mitarbeiter`", "index_provides_order": falsch, "order_direction": "nicht definiert", "Index": "idx_name_age_position", "plan_changed": falsch } /* Index-Bestellübersicht */ } /* Überdenken der Zugriffspfade für die Indexreihenfolge */ } ] /* Schritte */ } /* Join-Optimierung */ }, { "Ausführung beitreten": { "Auswahl#": 1, "Schritte": [ { "Dateisortierinformation": [ { "Richtung": "aufwärts", "Tabelle": "`Mitarbeiter`", "Feld": "Position" } ] /* Dateisortierinformation */, "Dateisortierprioritätswarteschlangenoptimierung": { "verwendbar": falsch, "Ursache": "nicht anwendbar (kein LIMIT)" } /* Optimierung der Dateisortierprioritätswarteschlange */, "filesort_execution": [ ] /* Dateisortierausführung */, "Dateisortierungszusammenfassung": { "Zeilen": 0, "untersuchte Zeilen": 0, "Anzahl temporärer Dateien": 0, "Sortierungspuffergröße": 200704, "Sortiermodus": "<Sortierschlüssel, Zusatzfelder>" } /* Dateisortierzusammenfassung */ } ] /* Schritte */ } /* Ausführung_verbinden */ } ] /* Schritte */ } Wenn wir uns das Trace-Feld ansehen, können wir erkennen, dass die Kosten für das Index-Scanning geringer sind als die Kosten für das vollständige Tabellen-Scanning. Daher entscheidet sich MySQL schließlich für das Index-Scanning. SET SESSION optimizer_trace="enabled=off"; -- Trace deaktivieren Zusammenfassen Das Obige ist meine Einführung in die Auswahl eines geeigneten Indexes für MySQL. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken! Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank! Das könnte Sie auch interessieren:
|
<<: JS implementiert einen detaillierten Plan für die reibungslose Version des Fortschrittsbalkens
>>: So konfigurieren Sie die Linux-Firewall und öffnen die Ports 80 und 3306
1. Einleitung MDL-Sperren in MySQL haben schon im...
In diesem Artikel wird der spezifische Code von j...
Hinweis: nginx über brew installiert Stammverzeic...
Ich habe kürzlich in der Firma an einem Projekt g...
Inhaltsverzeichnis 1. Node.js und Vue 2. Führen S...
Was ist wxs? wxs (WeiXin Script) ist eine Skripts...
1. Yum-Installation yum installiere Subversion 2....
Anaconda ist die beliebteste Python-Plattform für...
https-Basisport 443. Er wird für etwas verwendet,...
Im Windows-Betriebssystem das Programm zum Abfrag...
Inhaltsverzeichnis MySQL Master-Slave-Replikation...
Beim Erstellen von Webseiten ist die Verwendung d...
Vorwort Dieser Artikel stellt hauptsächlich den r...
Fehlermeldung: FEHLER 2002 (HY000): Verbindung zu...
Vorwort In unserer täglichen Arbeit müssen wir hä...