Die Praxis ist der einzige Weg, die Wahrheit zu testen. Dieser Artikel stellt nur die allgemeine Verwendung von Indizes dar. Sie müssen nur den gesamten Artikel lesen und ihn mit bestimmten Beispielen kombinieren oder sich an die Stellen erinnern, an denen er in der Vergangenheit verwendet wurde, um ein umfassendes Verständnis des Ganzen zu erlangen und zu verstehen, wie der Index funktioniert. Wenn Sie in Zukunft Indizes verwenden oder optimieren, können Sie von diesen Aspekten ausgehen, um die korrekte und effiziente Verwendung von Indizes weiter zu vertiefen. 1. Indexfehler Indexfehler sind ein häufiges Thema. Wenn von Datenbankoptimierung und Indexverwendung die Rede ist, kann man in einem Atemzug viele Szenarien aufzählen, in denen Indexe versagen, was nicht verwendet werden kann und was nicht verwendet werden sollte. Ich werde sie hier nicht einzeln aufzählen. Von einem Indexfehler spricht man, wenn für ein Feld in einer Tabelle ein Index erstellt wird, der Index jedoch aufgrund einer falschen SQL-Anweisung ungültig wird. Wenn die Indexspalte in SQL-Anweisungen als Teil eines Ausdrucks verwendet wird oder an Funktionen oder mathematischen Operationen beteiligt ist, wird der Index ungültig. Beispielsweise kann die folgende Abfrage den Index der Spalte „Alter“ nicht verwenden: Wählen Sie ID, Name, Alter aus t_user, wobei Alter + 1 = 7; Es ist leicht zu erkennen, dass der Ausdruck in where eigentlich äquivalent zu age=8 ist, aber MySQL kann diesen Ausdruck nicht automatisch analysieren. Dies ist ausschließlich Benutzerverhalten. (Aus dem vorherigen Artikel wissen wir, dass MySQL zuerst den Index nach Werten durchsucht und dann die Datenzeile zurückgibt, die dem Indexwert entspricht. Sobald die Indexspalte bearbeitet wird, kann die entsprechende Datenzeile nicht richtig gefunden werden. Daher wird die gesamte Tabelle Zeile für Zeile durchsucht, um die Abfrage zu vergleichen.) 2. Präfixindex und Indexselektivität Manchmal führt die Verwendung einer Spalte mit sehr langem Inhalt als Indexspalte dazu, dass der Index sehr groß und langsam wird. Wenn Sie dieser Spalte einen Index hinzufügen müssen, ist die Lösung der im vorherigen Artikel erwähnte simulierte Hash-Index. Normalerweise können die ersten paar Zeichen indiziert werden, wodurch der Indexspeicherplatz erheblich gespart und die Indexeffizienz verbessert werden kann, jedoch auch die Selektivität des Index verringert wird. Die Selektivität eines Indexes bezeichnet das Verhältnis der Anzahl eindeutiger Indexwerte (auch Kardinalität genannt) zur Gesamtzahl der Datensätze in den Tabellendaten T und liegt im Bereich von 1/T bis 1. Je höher die Selektivität des Indexes, desto höher die Abfrageeffizienz, denn ein hochselektiver Index ermöglicht es MySQL, bei der Suche mehr Zeilen herauszufiltern. Die Selektivität eines eindeutigen Indexes beträgt 1. Dies ist die beste Indexselektivität und weist die beste Leistung auf. Bei Spalten vom Typ BLOB, TEXT oder großen VARCHAR muss die Spalte einen Präfixindex verwenden, um die Abfrageleistung zu verbessern, wenn sie als Abfragebedingungen verwendet werden (grundsätzlich sollten solche Vorgänge vermieden werden, manchmal sind sie jedoch erforderlich). Weil MySQL keine Indizierung der vollständigen Länge dieser Spalten zulässt. 3. Mehrspaltiger Index Ein mehrspaltiger Index bedeutet, dass für jede Spalte ein unabhängiger Index erstellt wird. Bei der SQL-Optimierung indizieren manche Benutzer alle Spalten in der Where-Bedingung in der Hoffnung, die Abfrageleistung zu optimieren. Tatsächlich ist eine solche Optimierung jedoch sehr falsch. Im besten Fall kann es sich nur um einen „Ein-Stern“-Index handeln, und seine Leistung kann mehrere Datenebenen unter der des wirklich optimalen Index liegen. Wenn es manchmal nicht möglich ist, einen „Drei-Sterne“-Index zu entwerfen, ist es besser, die Where-Klausel zu ignorieren und sich auf die Optimierung der Reihenfolge der Indexspalten zu konzentrieren oder einen vollständig abdeckenden Index zu erstellen.
Das Erstellen unabhängiger Einzelspaltenindizes für mehrere Spalten verbessert in den meisten Fällen nicht die Leistung von MySQL-Abfragen. Auch das ist der falsche Ansatz. MySQL 5.0 und spätere Versionen führten eine Indexzusammenführungsstrategie ein, die mehrere einspaltige Indizes für eine Tabelle verwenden kann, um eine angegebene Zeile bis zu einem gewissen Grad zu lokalisieren. Frühere Versionen von MySQL konnten nur einen der einspaltigen Indizes verwenden, aber in diesem Fall war kein einspaltiger Index besonders effektiv. Strategien zum Zusammenführen von Indizes sind manchmal das Ergebnis einer Optimierung, aber häufiger deuten sie darauf hin, dass die Indizes der Tabelle schlecht konstruiert sind: 1) Wenn eine Schnittmenge mehrerer Indizes (normalerweise mit mehreren UND-Bedingungen) verwendet wird, bedeutet dies normalerweise, dass ein mehrspaltiger Index mit allen relevanten Spalten erforderlich ist und nicht mehrere unabhängige einspaltige Indizes. 2) Wenn mehrere Indizes kombiniert werden müssen (normalerweise mit mehreren ODER-Bedingungen), werden für die Caching-, Sortier- und Zusammenführungsvorgänge des Algorithmus normalerweise große Mengen an CPU- und Speicherressourcen verbraucht. Dies gilt insbesondere, wenn einige der Indizes nicht sehr selektiv sind und große Mengen der vom Scan zurückgegebenen Daten zusammenführen müssen. 3) Der Optimierer berechnet diese nicht in die „Abfragekosten“, der Optimierer kümmert sich nur um zufällige Seitenaufrufe. Dies führt dazu, dass die Abfragekosten „unterschätzt“ werden, was dazu führt, dass der Ausführungsplan schlechter ist als ein direkter vollständiger Tabellenscan. Dadurch werden nicht nur mehr CPU- und Speicherressourcen verbraucht, sondern es kann auch die Parallelität der Abfrage beeinträchtigt werden. Wenn eine solche Abfrage jedoch einzeln ausgeführt wird, werden die Auswirkungen auf die Parallelität häufig ignoriert. Wenn Sie im Ausführungsplan EXPLAIN eine Indexzusammenführung sehen, sollten Sie die Abfrage- und Tabellenstruktur überprüfen, um festzustellen, ob sie optimal sind. Sie können auch den Parameter optimizer_switch verwenden, um die Indexzusammenführungsfunktion zu deaktivieren, oder den Hinweis IGNORE INDEX verwenden, um den Optimierer bestimmte Indizes ignorieren zu lassen. Bei mehrspaltigen Indizes wird der Index im Allgemeinen nicht ungültig, solange die Spalte ganz links in den Abfragebedingungen verwendet wird. Nachfolgend sind einige Beispiele aufgeführt: Die Tabelle t_user erstellt einen mehrspaltigen Index (ID, Name) wie folgt: mysql> anzeigen, Tabelle erstellen t_user; +--------+--------------+ | Tabelle | Tabelle erstellen | +--------+--------------+ | t_user | CREATE TABLE `t_user` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `Alter` int(11) DEFAULT NULL, SCHLÜSSEL `idx` (`id`,`name`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 | +--------+-----------------------------------------+ 1 Reihe im Set Führen Sie die Abfrage nach ID wie folgt durch: mysql> erläutern Sie „select * from t_user where id = 1;“ +----+----------+--------+------------+------+---------------+-----+---------+---------+-------+-------+------+------+------+ | ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra | +----+----------+--------+------------+------+---------------+-----+---------+---------+-------+-------+------+------+------+ | 1 | SIMPLE | t_user | NULL | ref | idx | idx | 4 | const | 1 | 100 | NULL | +----+----------+--------+------------+------+---------------+-----+---------+---------+-------+-------+------+------+------+ 1 Reihe im Set Am Typ im Ausführungsplan können wir erkennen, dass der Index gültig ist. Wenn Sie jedoch nach Namen abfragen, schlägt der Index fehl (vollständiger Tabellenscan) und zwar wie folgt: mysql> erläutern Sie „select * from t_user where name = 'xcbeyond';“ +----+----------+--------+------------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+-------------+ | ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra | +----+----------+--------+------------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+-------------+ | 1 | SIMPLE | t_user | NULL | ALL | NULL | NULL | NULL | NULL | 7 | 14.29 | Verwenden von where | +----+----------+--------+------------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+-------------+ 1 Reihe im Set 4. Wählen Sie die entsprechende Indexspaltenreihenfolge Die Reihenfolge der Indexspalten ist wirklich wichtig. Die richtige Reihenfolge hängt von der Abfrage ab, die den Index verwendet, und muss auch berücksichtigen, wie die Sortier- und Gruppierungsanforderungen besser erfüllt werden können (gilt nur für B-Tree-Indizes; Hash- oder andere Indizes speichern Daten nicht sequenziell). In einem mehrspaltigen B-Tree-Index bedeutet die Reihenfolge der Indexspalten, dass der Index zuerst nach der Spalte ganz links sortiert wird. Daher kann der Index in aufsteigender oder absteigender Reihenfolge durchsucht werden, um die Abfrageanforderungen von Klauseln wie „order by“, „group by“ und „distinct“ zu erfüllen, die der Spaltenreihenfolge entsprechen. Daher ist die Reihenfolge der Spalten in einem mehrspaltigen Index entscheidend. Eine Faustregel für die Auswahl der Spaltenreihenfolge in einem Index besteht darin, den selektivsten Index an den Anfang zu setzen. Diese Erfahrung ist in einigen Szenarien sehr nützlich, aber normalerweise nicht so wichtig wie das Vermeiden von zufälliger E/A und Sortierung, und das Problem muss umfassender betrachtet werden. Wenn Sortieren und Gruppieren kein Problem darstellen müssen, empfiehlt es sich häufig, die selektivsten Spalten an den Anfang zu setzen. Derzeit besteht die Rolle des Indexes nur darin, die Suche der Where-Bedingung zu optimieren. In diesem Fall kann der so konzipierte Index tatsächlich die benötigten Zeilen möglichst schnell herausfiltern und ist zudem selektiver für Abfragen, die in der Where-Klausel nur die Präfixspalten des Indexes verwenden. Die Leistung hängt jedoch nicht nur von der Selektivität aller Indexspalten ab, sondern auch von den spezifischen Werten der Abfragebedingungen, dh von der Verteilung der Werte (die Reihenfolge der Indexspalten muss entsprechend den am häufigsten ausgeführten Abfragen angepasst werden, um die Indexspalten in diesem Fall möglichst selektiv zu gestalten). 5. Clustered-Index Ein gruppierter Index ist kein separater Indextyp, sondern eine Datenspeichermethode, die Datenspeicherung und Indizierung miteinander kombiniert. Wenn Sie die Indexseite finden, finden Sie die Daten. Die genauen Details hängen von der Implementierung ab, aber der gruppierte Index von
Wenn eine Tabelle über einen gruppierten Index verfügt, werden ihre Datenzeilen tatsächlich auf den Blattseiten des Index gespeichert. „Clustered“ bedeutet, dass Datenzeilen und benachbarte Schlüsselwerte kompakt zusammen gespeichert werden. Da es unmöglich ist, Datenzeilen gleichzeitig an zwei verschiedenen Orten zu speichern, kann eine Tabelle nur einen gruppierten Index haben. Clustered-Index-Einstellungen: Der Standard ist der Primärschlüssel. Wenn kein Primärschlüssel definiert ist, wählt (Wenn Sie mit der B-Tree-Indexstruktur vertraut sind, wissen Sie, warum [Schlüssel, Daten] als Tupel in einem Knoten gespeichert werden.) Ein gruppierter Primärschlüssel kann die Leistung verbessern, aber auch schwerwiegende Leistungsprobleme verursachen. Daher müssen Clustered-Indizes sorgfältig überlegt werden, insbesondere wenn die Speicher-Engine einer Tabelle von InnoDB zu einer anderen Engine geändert wird (oder umgekehrt). Vorteile von Clustered-Indizes:
Nachteile des Clustered-Index:
6. Abdeckungsindex Normalerweise werden entsprechende Indizes auf Grundlage der Where-Bedingungen der Abfrage erstellt, dies ist jedoch nur ein Aspekt der Indexoptimierung. Ein gut konzipierter Index sollte die gesamte Abfrage berücksichtigen, nicht nur die Where-Bedingung. Indizes stellen tatsächlich eine effiziente Methode zum Auffinden von Daten dar. MySQL kann mithilfe von Indizes jedoch auch Spaltendaten direkt abrufen, sodass das Lesen von Datenzeilen nicht mehr erforderlich ist. Wenn ein Index alle abzufragenden Feldwerte enthält, nennen wir ihn einen „abdeckenden Index“, d. h. ein Index deckt alle Spalten der Where-Bedingung ab. Die Vorteile der Indexabdeckung sind folgende:
Nicht alle Indextypen können abdeckende Indizes sein. Überdeckende Indizes müssen die Indexspalte speichern, während Hash-Indizes, räumliche Indizes und Volltextindizes die Werte der Indexspalten nicht speichern. Daher kann MySQL nur B-Tree verwenden, um überdeckende Indizes zu erstellen. Darüber hinaus implementieren verschiedene Speicher-Engines überdeckende Indizes auf unterschiedliche Weise, und nicht alle Engines unterstützen überdeckende Indizes. 7. Verwenden Sie den Index-Scan zum Sortieren MySQL bietet zwei Möglichkeiten, geordnete Ergebnismengen zu generieren: durch eine Sortieroperation oder durch Scannen in Indexreihenfolge. Wenn der Wert der Typspalte in Das Scannen des Indexes selbst geht schnell, weil man nur von einem Indexdatensatz zum unmittelbar nächsten Datensatz wechseln muss. Wenn der Index jedoch nicht alle für die Abfrage erforderlichen Spalten abdeckt, müssen Sie bei jedem Scannen eines Indexdatensatzes zur Tabelle zurückkehren, um die entsprechende Zeile abzufragen. Da es sich im Wesentlichen um zufällige E/A-Vorgänge handelt, ist das Lesen der Daten in Indexreihenfolge normalerweise langsamer als ein sequentieller vollständiger Tabellenscan, insbesondere bei E/A-intensiven Arbeitslasten. MySQL kann denselben Index sowohl zum Sortieren als auch zum Suchen von Zeilen verwenden. Daher sollte der Index nach Möglichkeit so gestaltet sein, dass er beide Situationen gleichzeitig erfüllt, d. h. die Indexspalte wird als Sortierspalte verwendet.
8. Redundante und doppelte Indizes Doppelte Indizes sind Indizes desselben Typs, die für dieselben Spalten in derselben Reihenfolge erstellt werden. Die Erstellung doppelter Indizes sollte vermieden und nach Entdeckung sofort entfernt werden. Zum Beispiel: Tabellentest erstellen{ id int nicht null Primärschlüssel, eine Ganzzahl ungleich null, b int ungleich null, eindeutig (ID) Index(ID) }engine=InnoDB; Ein unerfahrener Benutzer möchte möglicherweise einen Primärschlüssel erstellen, eine eindeutige Einschränkung Es gibt einige Unterschiede zwischen redundanten und doppelten Indizes. Wenn Sie beispielsweise einen Index Redundante Indizes treten normalerweise auf, wenn einer Tabelle neue Indizes hinzugefügt werden. Beispielsweise könnte jemand einen neuen Index In den meisten Fällen werden redundante Indizes nicht benötigt und vorhandene Indizes sollten erweitert werden, anstatt neue zu erstellen. Manchmal sind jedoch aus Leistungsgründen redundante Indizes erforderlich, da die Erweiterung eines vorhandenen Indexes dazu führen würde, dass dieser zu groß wird, was wiederum die Leistung anderer Abfragen, die den Index verwenden, beeinträchtigen würde. Wenn Sie beispielsweise einem Integer-Spaltenindex eine sehr lange Die Lösung für redundante und doppelte Indizes ist sehr einfach: Löschen Sie sie einfach. Aber zuerst müssen wir einen solchen Index finden. Sie können sie finden, indem Sie einige komplexe Abfragen schreiben, die auf 9. Unbenutzte Indizes Zusätzlich zu redundanten und doppelten Indizes kann es einige Indizes geben, die der Server nie verwendet. Ein solcher Index ist völlig überflüssig und es wird empfohlen, ihn direkt zu löschen. Sie können die Tabelle SELECT Objektschema, Objektname, Indexname FROM Performanceschema.table_io_waits_summary_by_index_usage, wobei Indexname NICHT NULL ist und count_star = 0 ORDER BY Objektschema, Objektname, Indexname; 10. Indizes und Sperren Durch Indizes können Abfragen weniger Zeilen sperren . Wenn Ihre Abfragen nie auf Zeilen zugreifen, die nicht benötigt werden, werden weniger Zeilen gesperrt, was sich in zweierlei Hinsicht positiv auf die Leistung auswirkt. Erstens: Obwohl die Zeilensperren von 11. Zusammenfassung Der obige Langtext dient der Erläuterung, wie Indizes effizient eingesetzt und Fehlanwendungen vermieden werden. Die Indizierung scheint einfach, ist aber in Wirklichkeit sehr kompliziert. Um sie wirklich gut zu nutzen, müssen Sie ständig üben. Die Praxis ist der einzige Weg, die Wahrheit zu testen. Dieser Artikel stellt nur die allgemeine Verwendung von Indizes dar. Sie müssen nur den gesamten Artikel lesen und ihn mit bestimmten Beispielen kombinieren oder sich an die Stellen erinnern, an denen er in der Vergangenheit verwendet wurde, um ein umfassendes Verständnis des Ganzen zu erlangen und zu verstehen, wie der Index funktioniert. Wenn Sie in Zukunft Indizes verwenden oder optimieren, können Sie von diesen Aspekten ausgehen, um die korrekte und effiziente Verwendung von Indizes weiter zu vertiefen. Im üblichen Gebrauch von Indizes gibt es folgende Zusammenfassungen und Vorschläge:
Oben finden Sie Einzelheiten zur effizienten und korrekten Verwendung von Indizes zur Optimierung der MySQL-Leistung. Weitere Informationen zu MySQL-Indizes finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Detaillierte Schritte zur Verwendung von Redis in Docker
>>: Spezifische Verwendung des Vollbild-Scrollens von fullpage.js
Vorwort Das Zusammenführen oder Aufteilen anhand ...
JavaScript - Prinzipienreihe Wenn wir in der tägl...
1. Firewall-Regeln festlegen Beispiel 1: Port 808...
JS-Lauftrilogie js-Ausführungscode ist in drei Sc...
1. Einleitung Heute hat mich ein Kollege gefragt,...
Dieser Artikel stellt hauptsächlich den relevante...
1. Adresse herunterladen https://dev.mysql.com/do...
Inhaltsverzeichnis Tatsächlicher Kampfprozess Beg...
Tatsächlich ist XHTML 1.0 in zwei Typen unterteil...
Tabellenstruktur und deren Daten kopieren Die fol...
In diesem Artikel wird der Unterschied zwischen P...
Dokumentation: https://github.com/hilongjw/vue-la...
Inhaltsverzeichnis Anforderungen aus der Projektp...
1. Laden Sie MySql herunter und installieren Sie ...
Verifizierungsumgebung: [root@~~/]# rpm -qa | gre...