1. Grundkenntnisse der Indizierung 1.1 Vorteile von Indizes
1.2 Nützlichkeit von Indizes
1.3 Klassifizierung der IndizesDie Datenbank erstellt standardmäßig einen Index, allerdings nicht für den Primärschlüssel, sondern für den eindeutigen Schlüssel, da der Primärschlüssel eindeutig und nicht leer ist.
Beispielsweise besteht der Index hier aus drei Feldern: ID, Name und Alter. Die Indexzeilen werden in der Reihenfolge ID/Name/Alter gespeichert. Der Index kann die folgenden Feldkombinationen indizieren: (ID, Name, Alter), (ID, Name) oder (ID). Wenn die abzufragenden Felder nicht das am weitesten links stehende Präfix des Indexes darstellen, wird der Index nicht verwendet. Beispielsweise werden Alter oder die Kombination aus (Name, Alter) nicht über den Index abgefragt. 1.4 Fachbegriffe für VorstellungsgesprächeTabellenrückgabe: Nachdem die Datenbank die Zeile gefunden hat, in der sich der angegebene Datensatz anhand des Index (nicht des Primärschlüssels) befindet, muss sie die Daten anhand des Primärschlüssels erneut aus dem Datenblock abrufen. Dies wird als Tabellenrückgabe bezeichnet. Index zum Thema: Lesen Sie einen Artikel, den ich geschrieben habe: Ich habe die drei Interviews zu einer SQL-Frage nicht bestanden - SQL-Leistungsoptimierung Ganz links stehende Übereinstimmung: Wenn Ihre SQL-Anweisung in einem kombinierten Index den ganz links stehenden Index im kombinierten Index verwendet, kann diese SQL-Anweisung diesen kombinierten Index für die Übereinstimmung verwenden. Wenn eine Bereichsabfrage (>, <, zwischen, wie) gefunden wird, wird die Übereinstimmung beendet. select * from t where a=1 and b=1 and c =1; #Auf diese Weise können Sie den definierten Index (a,b,c) verwenden und a,b,c verwenden select * from t where a=1 and b=1; #Auf diese Weise können Sie den definierten Index (a,b,c) verwenden und a,b verwenden select * from t where b=1 and a=1; #Auf diese Weise können Sie die definierten Indizes (a, b, c) verwenden und a und c verwenden (MySQL hat einen Abfrageoptimierer) select * from t where a=1; #Auf diese Weise können wir auch den definierten Index (a, b, c) verwenden, indem wir a select * from t where b=1 and c=1; #Die Verwendung definierter Indizes (a, b, c) ist nicht zulässig. select * from t where a=1 and c=1; #Auf diese Weise können die definierten Indizes (a, b, c) verwendet werden, aber nur Index a wird verwendet, die Indizes b und c werden nicht verwendet Index Pushdown: Auch Index Condition Pushdown (ICP) genannt, ist eine von MySQL bereitgestellte Methode, um einen bestimmten Index zu verwenden, um Tupel aus einer bestimmten Tabelle zu erhalten. Beachten Sie, dass wir hier bewusst „eins“ hervorgehoben haben, da eine solche Indexoptimierung nicht für Mehrtabellenverbindungen, sondern für Einzeltabellenscans verwendet wird. Genauer gesagt handelt es sich um eine Möglichkeit, eine einzelne Tabelle mithilfe eines Indexes zu scannen, um Daten zu erhalten. 1.5 Vom Index verwendete Datenstruktur1.5.1 Hash-TabelleMangel︰ 1. Wenn Hash-Speicher verwendet wird, müssen alle Datendateien dem Speicher hinzugefügt werden, was mehr Speicherplatz verbraucht. 2. Wenn alle Abfragen gleichwertige Abfragen sind, ist Hashing tatsächlich sehr schnell. In Unternehmen oder tatsächlichen Arbeitsumgebungen werden jedoch mehr Daten innerhalb eines Bereichs durchsucht als gleichwertige Abfragen, sodass Hashing nicht sehr geeignet ist. 1.5.2 Binärer BaumNachteile: Unabhängig davon, ob es sich um einen Binärbaum oder einen Rot-Schwarz-Baum handelt, erhöht die Tiefe des Baums die Anzahl der E/A-Vorgänge und beeinträchtigt die Effizienz des Datenlesens. 1.5.3 B+ BaumB-Baum-Funktionen: 1. Alle Schlüsselwerte sind im gesamten Baum verteilt 2. Die Suche kann an einem Nicht-Blattknoten enden, und es wird eine Suche im gesamten Schlüsselwortsatz durchgeführt, wobei die Leistung der einer binären Suche nahe kommt. 3. Jeder Knoten hat höchstens m Teilbäume 4. Der Wurzelknoten hat mindestens 2 Teilbäume 5. Ein Verzweigungsknoten hat mindestens m/2 Teilbäume (alle Knoten außer dem Wurzelknoten und dem Blattknoten sind Verzweigungsknoten) 6. Alle Blattknoten befinden sich auf derselben Ebene, jeder Knoten kann höchstens m-1 Schlüssel haben und sie sind in aufsteigender Reihenfolge angeordnet Beispiel einer Diagrammbeschreibung: Jeder Knoten belegt einen Plattenblock. Ein Knoten hat zwei aufsteigende Schlüsselwörter und drei Zeiger auf den Stammknoten des Unterbaums. Der Zeiger speichert die Adresse des Plattenblocks, in dem sich der untergeordnete Knoten befindet. Die drei durch die beiden Schlüsselwörter unterteilten Bereichsdomänen entsprechen den Bereichsdomänen der Daten der Teilbäume, auf die die drei Zeiger zeigen. Am Beispiel des Stammknotens lauten die Schlüsselwörter 16 und 34, der Datenbereich des Teilbaums, auf den der Zeiger P1 zeigt, ist kleiner als 16, der Datenbereich des Teilbaums, auf den der Zeiger P2 zeigt, ist 16 bis 34, und der Datenbereich des Teilbaums, auf den der Zeiger P3 zeigt, ist größer als 34. Ablauf der Stichwortsuche:
Mangel:
1.6 Index-Matching-MethodeVollständige Wertübereinstimmung: Vollständige Wertübereinstimmung bezieht sich auf die Übereinstimmung aller Spalten im Index. Erläutern Sie „select * from staffs“, wobei „Name“ = „Juli“ und „Alter“ = „23“ und „Position“ = „Entwickler“ ist. Passt zum äußersten linken Präfix: Passt nur zu den ersten paar Spalten Erläutern Sie „Select * from Staffs“, wobei Name = „Juli“ und Alter = „23“ ist. Erläutern Sie „Select * from Staffs“, wobei „Name“ = „Juli“ ist. Spaltenpräfix abgleichen: Sie können den Anfang eines Spaltenwerts abgleichen. Erklären Sie „Select * from Staffs“, wo der Name beispielsweise „J%“ lautet. Erläutern Sie „select * from staffs where name like '%y'“; Bereichswert abgleichen: Sie können nach Daten innerhalb eines bestimmten Bereichs suchen. Erklären Sie „Select * from Staffs where Name > ‚Mary‘“; Genaue Übereinstimmung mit einer Spalte und Bereichsübereinstimmung mit einer anderen Spalte: Sie können die gesamte erste Spalte und einen Teil der zweiten Spalte abfragen. Erläutern Sie „Select * from Staffs“, wobei Name = „Juli“ und Alter > 25 ist. Nur-Index-Abfragen: Bei der Abfrage muss nur auf den Index zugegriffen werden, nicht auf Datenzeilen. Dies ist im Wesentlichen ein abdeckender Index. Erläutern Sie „select name, age, pos from staffs where name = ,Juli‘ und age = 25 und pos = ,dev‘“. 2. Hash-IndexBasierend auf der Implementierung von Hash-Tabellen sind nur Abfragen gültig, die genau mit allen Spalten des Index übereinstimmen In MySQL unterstützt nur die Speicher-Engine explizit Hash-Indizes. Der Hash-Index selbst muss nur den entsprechenden Hash-Wert speichern, daher ist die Indexstruktur sehr kompakt, was die Hash-Indexsuche sehr schnell macht. 2.1 Einschränkungen von Hash-Indizes
2.2 Beispiele Wenn Sie eine große Anzahl von URLs speichern und Sie können auch Diese Abfrage weist eine hohe Leistung auf, da für die Suche ein sehr kleiner Index verwendet wird. 3. Zusammengesetzter IndexBeim Einbeziehen mehrerer Spalten als Indizes ist zu beachten, dass die richtige Reihenfolge von der Abfrage des Index abhängt. Außerdem müssen Sie überlegen, wie Sie den Anforderungen hinsichtlich Sortierung und Gruppierung besser gerecht werden können. Beispiel: Erstellen Sie einen zusammengesetzten Index a, b, c und verwenden Sie den Index in verschiedenen SQL-Anweisungen
4. Clustered-Index und Nicht-Clustered-Index 4.1 Clustered-IndexEs handelt sich nicht um einen separaten Indextyp, sondern um eine Datenspeichermethode. Dies bedeutet, dass Datenzeilen und benachbarte Schlüsselwerte kompakt zusammen gespeichert werden, wodurch Datenspeicher und Indizes zusammengeführt werden. Durch das Finden des Index werden auch die Daten gefunden. Wenn kein Primärschlüssel definiert ist, wählt InnoDB stattdessen einen eindeutigen, nicht leeren Index. Wenn kein eindeutiger Index vorhanden ist, definiert InnoDB implizit einen Primärschlüssel als gruppierten Index. InnoDB clustert nur Datensätze innerhalb derselben Seite. Seiten mit benachbarten Schlüsselwerten können weit voneinander entfernt sein. 4.2 Nicht gruppierte IndizesDie Datendatei wird getrennt von der Indexdatei gespeichert, und die Daten werden in einer vom Index getrennten Struktur gespeichert. Der Blattknoten der Indexstruktur zeigt auf die entsprechende Zeile der Daten. MyISAM speichert den Index über key_buffer im Speicher zwischen. Wenn auf die Daten zugegriffen werden muss (Zugriff über den Index), wird der Index direkt im Speicher durchsucht, und dann werden die entsprechenden Daten auf der Festplatte über den Index gefunden. Aus diesem Grund ist die Geschwindigkeit langsam, wenn der Index nicht im Schlüsselpuffer gefunden wird. Die Daten auf der Datenseite werden über den Blattknotenzeiger gefunden, sodass der nicht gruppierte Index in logischer Reihenfolge vorliegt 5. Abdeckungsindex 5.1 Grundlegende Einführung
5.2 Vorteile1. Indexeinträge sind normalerweise viel kleiner als die Größe von Datenzeilen. Wenn Sie nur den Index lesen müssen, reduziert MySQL die Datenzugriffe erheblich. 2. Da der Index in der Reihenfolge der Spaltenwerte gespeichert wird, ist der IO-Aufwand bei IO-intensiven Bereichsabfragen wesentlich geringer als beim zufälligen Lesen jeder einzelnen Datenzeile von der Festplatte. 3. Einige Speicher-Engines wie MYISAM speichern Indizes nur im Speicher und verlassen sich beim Zwischenspeichern der Daten auf das Betriebssystem. Daher ist zum Zugriff auf die Daten ein Systemaufruf erforderlich, was zu schwerwiegenden Leistungsproblemen führen kann. 4. Covering-Indizes sind besonders nützlich für INNODB-Tabellen aufgrund der Clustered-Indizes von INNODB 5.3 Falldemonstration1. Wenn eine durch einen Index abgedeckte Abfrage initiiert wird, können die verwendeten Indexinformationen in der zusätzlichen Erläuterungsspalte angezeigt werden. Zu diesem Zeitpunkt wird der abdeckende Index verwendet. 2. In den meisten Speicher-Engines können abdeckende Indizes nur Abfragen abdecken, die nur auf einige Spalten im Index zugreifen. Eine weitere Optimierung ist jedoch möglich, indem zur Abdeckung der Abfrage der sekundäre Index von InnoDB verwendet wird. Beispielsweise verwendet actor die Speicher-Engine innodb und verfügt über einen sekundären Index für das Feld last_name. Obwohl die Spalten dieses Indexes den Primärschlüssel actor_id nicht enthalten, kann er auch verwendet werden, um eine übergeordnete Abfrage für actor_id durchzuführen. 6. Optimieren Sie kleine DetailsVermeiden Sie bei der Verwendung von Indexspalten für Abfragen möglichst die Verwendung von Ausdrücken und platzieren Sie die Berechnungen in der Geschäftsebene statt in der Datenbankebene. Versuchen Sie, Primärschlüsselabfragen anstelle anderer Indizes zu verwenden, da Primärschlüsselabfragen keine Tabellenabfragen auslösen. Präfixindex verwenden >Manchmal müssen Sie eine sehr lange Zeichenfolge indizieren, was den Index groß und langsam macht. Normalerweise können Sie am Anfang einer Spalte eine Teilzeichenfolge verwenden, was erheblich Indexplatz spart und die Indexeffizienz verbessert. Dies verringert jedoch die Selektivität des Index. Die Selektivität des Index bezieht sich auf das Verhältnis nicht wiederholter Indexwerte zur Gesamtzahl der Datensätze in der Datentabelle und reicht von 1/#T bis 1. Je höher die Selektivität des Indexes, desto höher die Abfrageeffizienz, da ein selektiverer Index es MySQL ermöglicht, bei der Suche mehr Zeilen herauszufiltern. Im Allgemeinen ist die Selektivität eines Spaltenpräfixes hoch genug, um die Abfrageleistung zu erreichen, aber für Spalten vom Typ BLOB, TEXT und VARCHAR muss ein Präfixindex verwendet werden, da MySQL keine Indizierung der gesamten Länge dieser Spalten zulässt. Der Trick bei der Verwendung dieser Methode besteht darin, ein Präfix zu wählen, das lang genug ist, um eine hohe Selektivität zu gewährleisten, aber nicht zu lang. --Erstellen Sie eine Datentabelle create table citydemo(city varchar(50) not null); in citydemo(city) einfügen, Stadt aus Stadt auswählen; -- Wiederholen Sie die folgende SQL-Anweisung fünfmal: insert into citydemo(city) select city from citydemo; --Aktualisieren Sie den Namen der Stadttabelle. Update Citydemo Set City = (Wählen Sie eine Stadt aus der Stadtreihenfolge nach Rand () aus, Limit 1); --Suchen Sie die am häufigsten vorkommende Städteliste und stellen Sie fest, dass jeder Wert 45-65 Mal vorkommt. Wählen Sie Anzahl(*) als Anzahl, Stadt aus Citydemo, gruppieren Sie nach Stadt, sortieren Sie nach Anzahl, Abstiegslimit 10; --Suchen Sie das am häufigsten vorkommende Städtepräfix, beginnend mit den 3 Präfixbuchstaben, und stellen Sie fest, dass es häufiger vorkommt als zuvor. Sie können mehrere Zeichen abfangen, um zu sehen, wie oft die Stadt vorkommt. select count(*) as cnt,left(city,3) as pref from citydemo group by pref order by cnt desc limit 10; Wähle Anzahl(*) als Anzahl, links(Stadt, 7) als Präferenz aus der Citydemo-Gruppe nach Präferenz, sortiere nach Anzahl, Abstiegsgrenze 10; --An diesem Punkt liegt die Selektivität des Präfixes nahe an der Selektivität der gesamten Spalte--Sie können auch eine andere Methode verwenden, um die Selektivität der gesamten Spalte zu berechnen. Sie können sehen, dass, wenn die Präfixlänge 7 erreicht, die Selektivitätsverbesserung sehr gering ist, wenn die Präfixlänge erhöht wird. select count(distinct left(city,3))/count(*) as sel3, Anzahl(deutlich links(Stadt,4))/Anzahl(*) als sel4, Anzahl(deutlich links(Stadt,5))/Anzahl(*) als sel5, Anzahl(deutlich links(Stadt,6))/Anzahl(*) als sel6, Anzahl(deutlich links(Stadt,7))/Anzahl(*) als sel7, Anzahl(unterschiedliche Links(Stadt,8))/Anzahl(*) als sel8 von Citydemo; --Nachdem die Berechnung abgeschlossen ist, können Sie einen Präfixindex erstellen. Alter Table Citydemo Add Key (City (7)). --Hinweis: Ein Präfixindex ist eine effektive Möglichkeit, den Index kleiner und schneller zu machen, hat aber auch Nachteile: MySQL kann keinen Präfixindex für „Order by“ und „Group by“ verwenden. Verwenden Sie den Index-Scan zum Sortieren
union all, in oder können Indizes verwenden, aber in wird empfohlen. Bereichsspalten können Indizes verwenden. Die Bereichsbedingungen sind: <, >. Bereichsspalten können Indizes verwenden, aber Spalten, die der Bereichsspalte folgen, können keine Indizes verwenden. Ein Index kann höchstens für eine Bereichsspalte verwendet werden. Bei erzwungener Typkonvertierung wird die gesamte Tabelle gescannt Tabelle erstellen Benutzer (ID int, Name varchar (10), Telefon varchar (11)); Tabelle ändern, Benutzerindex hinzufügen, idx_1 (Telefon); erläutern Sie „select * from user where phone=13800001234;“ (löst den Index nicht aus) Erläutern Sie „select * from user where phone='13800001234'; (Triggerindex)“ Es ist nicht ratsam, Indizes für Felder zu erstellen, die häufig aktualisiert werden und eine geringe Datendifferenzierung aufweisen.
Die Spalte zum Erstellen eines Indexes lässt keine Nullwerte zu, was zu unerwarteten Ergebnissen führen kann. Wenn Sie Tabellen verknüpfen müssen, sollten Sie am besten nicht mehr als drei Tabellen verwenden, da die zu verknüpfenden Felder denselben Datentyp aufweisen müssen. Verwenden Sie, wann immer möglich, ein Limit Es wird empfohlen, die Anzahl der Indizes einer einzelnen Tabelle auf 5 oder weniger zu begrenzen. Die Anzahl der einzelnen Indexfelder darf 5 nicht überschreiten (kombinierter Index). Beim Erstellen eines Index sollten Sie die folgenden Missverständnisse vermeiden: > Je mehr Indizes, desto besser (falsch) > Vorzeitige Optimierung, Optimierung ohne Verständnis des Systems (Fehler) ZusammenfassenDies ist das Ende dieses Artikels über Tipps zum Wissen über MySQL-Indizes. Weitere relevante Inhalte zum Wissen über MySQL-Indizes finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Detaillierte Erklärung zum Javascript-Event-Bubbling, Event-Capture und Event-Delegation
>>: Erstellen eines FastDFS-Dateisystems in Docker (Tutorial mit mehreren Images)
1 Hintergrund Vor kurzem habe ich untersucht, wie...
Erstellen Sie eine neue server.js Garn init -y Ga...
Dieser Artikel beschreibt die Mysql-Self-Join-Abf...
Wenn wir ein Formular erstellen, legen wir häufig ...
HTML-Formulare werden verwendet, um verschiedene ...
Hintergrund Da die Anzahl der Unterprojekte des U...
Inhaltsverzeichnis 1. Grundlegendes Verständnis v...
1. Schalten Sie die Firewall aus und übertragen S...
Inhaltsverzeichnis Vorwort 1. Neue Partitionen vo...
MySQL-Fehler: Fehlercode: 1293 Falsche Tabellende...
Drei Tabellen sind miteinander verbunden. Feld a ...
In diesem Artikelbeispiel wird der spezifische Co...
Der ps-Befehl in Linux ist die Abkürzung für „Pro...
Vorwort Lassen Sie es mich hier zunächst erklären...
Was ist nGrinder? nGrinder ist eine Plattform für...