Ein kurzes Verständnis der drei Prinzipien zum Hinzufügen von MySQL-Indizes

Ein kurzes Verständnis der drei Prinzipien zum Hinzufügen von MySQL-Indizes

1. Die Bedeutung von Indizes

Indizes werden verwendet, um schnell Zeilen zu finden, die einen bestimmten Wert in einer Spalte haben. Ohne Index muss MySQL bei Datensatz 1 beginnen und die gesamte Tabelle lesen, bis es die relevanten Zeilen findet. Je größer der Tisch, desto zeitaufwändiger ist es. Wenn die abgefragte Tabellenspalte über einen Index verfügt, kann MySQL schnell zu einer Suchposition in der Mitte der Datendatei gelangen, ohne alle Daten durchsuchen zu müssen. Beachten Sie, dass sequentielle Lesevorgänge viel schneller sind, wenn Sie auf eine große Anzahl von Zeilen zugreifen müssen, da wir diesmal Suchvorgänge auf der Festplatte vermeiden.

Wenn Sie das chinesische Schriftzeichen „张“ im Xinhua-Wörterbuch nachschlagen, ohne das Inhaltsverzeichnis zu verwenden, müssen Sie möglicherweise von der ersten bis zur letzten Seite des Xinhua-Wörterbuchs suchen, was zwei Stunden dauern kann. Je dicker das Wörterbuch, desto mehr Zeit werden Sie verbringen. Nun suchen Sie im Verzeichnis nach dem chinesischen Schriftzeichen „张“. Der erste Buchstabe von 张 ist z. Chinesische Schriftzeichen, die mit z beginnen, finden sich auf über 900 Seiten. Mit diesem Hinweis brauchen Sie möglicherweise nur eine Minute, um ein chinesisches Schriftzeichen zu finden. Dies zeigt, wie wichtig die Indizierung ist. Aber heißt das, dass es besser ist, je mehr Indizes Sie erstellen? Natürlich nicht. Wenn das Verzeichnis eines Buches in mehrere Ebenen unterteilt ist, wird Ihnen wahrscheinlich schwindelig.

2. Vorbereitung

//Bereiten Sie zwei Testtabellen vormysql> CREATE TABLE `test_t` ( 
-> `id` int(11) NICHT NULL auto_increment, 
-> `num` int(11) NICHT NULL Standard '0', 
-> `d_num` varchar(30) NICHT NULL Standard '0', 
-> PRIMÄRSCHLÜSSEL (`id`) 
->) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
Abfrage OK, 0 Zeilen betroffen (0,05 Sek.) 
mysql> CREATE TABLE `test_test` ( 
-> `id` int(11) NICHT NULL auto_increment, 
-> `num` int(11) NICHT NULL Standard '0', 
-> PRIMÄRSCHLÜSSEL (`id`) 
->) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
Abfrage OK, 0 Zeilen betroffen (0,05 Sek.) 
//Erstellen Sie eine gespeicherte Prozedur, um das Einfügen von Daten zu erleichternmysql> Trennzeichen | 
mysql> Prozedur i_test erstellen(pa int(11),tab varchar(30)) 
-> beginnen 
-> deklariere max_num int(11) als Standard 100000; 
-> deklariere i als int default 0; 
-> deklarieren Sie rand_num int; 
-> deklarieren Sie double_num char; 
-> 
-> wenn Tab != 'test_test' dann 
-> wähle count(id) in max_num von test_t; 
-> während ich < pa mache 
-> wenn max_num < 100000 dann 
-> wählen Sie cast(rand()*100 als unsigniert) in rand_num; 
-> wähle concat(rand_num,rand_num) in double_num; 
-> einfügen in test_t(num,d_num)values(rand_num,double_num); 
-> Ende, wenn; 
-> setze i = i +1; 
-> Ende während; 
-> sonst 
-> wähle count(id) in max_num aus test_test; 
-> während ich < pa mache 
-> wenn max_num < 100000 dann 
-> wählen Sie cast(rand()*100 als unsigniert) in rand_num; 
-> einfügen in test_test(num)values(rand_num); 
-> Ende, wenn; 
-> setze i = i +1; 
-> Ende während; 
-> Ende, wenn; 
-> Ende| 
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) 
mysql> Trennzeichen; 
mysql> Variablen wie "%pro%" anzeigen; // Prüfen Sie, ob Profiling aktiviert ist. Standardmäßig ist es deaktiviert. +---------------------------+-------+ 
| Variablenname | Wert | 
+-----------------------------------------+----------+ 
| Profilierung | AUS | 
| Größe des Profilverlaufs | 15 | 
| Protokollversion | 10 | 
| Slave_Compressed_Protocol | AUS | 
+-----------------------------------------+----------+ 
4 Zeilen im Satz (0,00 Sek.) 
mysql> set profiling=1; //Nach dem Einschalten soll die Ausführungszeit nach dem Hinzufügen des Index verglichen werden. Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

3. Beispiele

1. Eine einzelne Tabelle enthält zu wenige Daten, und der Index beeinträchtigt die Geschwindigkeit

mysql> call i_test(10,'test_t'); //Füge 10 Bedingungen in die Tabelle test_t ein. Abfrage OK, 1 Zeile betroffen (0,02 Sek.) 
mysql> wähle num aus test_t, wobei num!=0; 
mysql> erklären Sie „select num from test_t“, wobei num!=0\G; 
*************************** 1. Reihe *************************** 
ID: 1 
select_type: EINFACH 
Tabelle: test_t 
Typ: ALLE 
mögliche Schlüssel: NULL 
Schlüssel: NULL 
key_len: NULL 
Ref: NULL 
Reihen: 10 
Extra: Verwenden von „where“ 
1 Zeile im Satz (0,00 Sek.) 
FEHLER: 
Keine Abfrage angegeben 
mysql> erstelle Index num_2 auf test_t (num); 
Abfrage OK, 10 Zeilen betroffen (0,19 Sek.) 
Datensätze: 10 Duplikate: 0 Warnungen: 0 
mysql> wähle num aus test_t, wobei num!=0; 
mysql> erklären Sie „select num from test_t“, wobei num!=0\G; 
*************************** 1. Reihe *************************** 
ID: 1 
select_type: EINFACH 
Tabelle: test_t 
Typ: Index 
mögliche Schlüssel: num_2 
Schlüssel: Num_2 
Schlüssellänge: 4 
Ref: NULL 
Reihen: 10 
Extra: Verwenden von „where“; Verwenden von „index“ 
1 Zeile im Satz (0,00 Sek.) 
FEHLER: 
Keine Abfrage angegeben 
mysql> Profile anzeigen; 
+----------+------------+---------------------------------------------+ 
| Abfrage-ID | Dauer | Abfrage | 
+----------+------------+---------------------------------------------+ 
| 1 | 0,00286325 | call i_test(10,'test_t') | //Füge zehn Datensätze ein | 2 | 0,00026350 | select num from test_t where num!=0 | 
| 3 | 0,00022250 | erkläre „select num from test_t“, wobei num!=0 | 
| 4 | 0,18385400 | create index num_2 on test_t (num) | //Index erstellen| 5 | 0,00127525 | select num from test_t where num!=0 | //Nach Verwendung des Index ist es fast 0,2-mal so viel wie ohne Verwendung des Index| 6 | 0,00024375 | Erläuterung select num from test_t where num!=0 | 
+----------+------------+------------------------------------------+ 
6 Zeilen im Satz (0,00 Sek.)

erklären:

  • id: gibt die Reihenfolge an, in der SQL ausgeführt wird
  • select_type: SIMPLE, PRIMARY, UNION, DEPENDENT UNION, UNION RESULT, SUBQUERY, DEPENDENT SUBQUERY, DERIVED Unterschiedliche Abfrageanweisungen haben unterschiedliche select_type
  • table: gibt den Namen der zu durchsuchenden Tabelle an
  • Typ : Gibt den zu verwendenden Indextyp an oder ob ein Index verwendet werden soll. Die Effizienz reicht von hoch bis niedrig: const, eq_reg, ref, range, index und ALL. Tatsächlich hängt dies direkt mit der Art und Weise zusammen, wie Sie SQL schreiben. Wenn Sie beispielsweise den Primärschlüssel verwenden können, verwenden Sie den Primärschlüssel. Fügen Sie der Bedingung nach „where“ einen Index hinzu. Wenn er eindeutig ist, fügen Sie einen eindeutigen Index hinzu.
  • Possible_keys : mögliche Indizes
  • Schlüssel : Index verwenden
  • key_len : die Länge des zu verwendenden Indexes
  • ref: Welche Spalte oder Konstante wird zusammen mit dem Schlüssel verwendet, um Zeilen aus der Tabelle auszuwählen. Dies ist normalerweise erforderlich, wenn eine gemeinsame Abfrage mehrerer Tabellen durchgeführt wird.
  • Zeilen : die Anzahl der gefundenen Zeilen
  • Extra: Zusätzliche Anweisungen

Vor einiger Zeit habe ich einen Blogbeitrag darüber geschrieben, was besser ist: MySQL distinct oder group by. Ein Freund hinterließ eine Nachricht, in der er sagte, dass die Testergebnisse sich von meinen damaligen Testergebnissen unterschieden. Damals habe ich es mit einer Analogie erklärt. Heute habe ich Zeit, das Funktionsprinzip des Index anhand von Beispielen intuitiver auszudrücken.

2. Beim Filtern mit Bedingungen nach „wo“, wie z. B. „Sortieren nach“, „Gruppieren nach“ usw., ist es am besten, den folgenden Feldern Indizes hinzuzufügen. Wählen Sie PRIMARY KEY, UNIQUE, INDEX und andere Indizes basierend auf den tatsächlichen Bedingungen aus, aber je mehr, desto besser. Seien Sie maßvoll.

3. Bei der Durchführung von Operationen mit mehreren Tabellen wie gemeinsamen Abfragen und Unterabfragen müssen verwandte Felder indiziert werden

mysql> call i_test(10,'test_test'); //Füge 10 Datensätze in die Tabelle test_test ein. Abfrage OK, 1 Zeile betroffen (0,02 Sek.) 
mysql> erklären select a.num as num1,b.num as num2 from test_t als Left Join tes 
t_Test als b auf a.num=b.num\G; 
*************************** 1. Reihe *************************** 
ID: 1 
select_type: EINFACH 
Tabelle: eine 
Typ: Index 
mögliche Schlüssel: NULL 
Schlüssel: num_2 
Schlüssellänge: 4 
Ref: NULL 
Reihen: 10 
Extra: Index verwenden 
*************************** 2. Reihe *************************** 
ID: 1 
select_type: EINFACH 
Tabelle: b 
Typ: ref 
mögliche Schlüssel: num_1 
Schlüssel: num_1 
Schlüssellänge: 4 
ref: bak_test.a.num //bak_test ist der Datenbankname, a.num ist ein Feld mit test_t-Zeilen: 1080 
Extra: Index verwenden 
2 Zeilen im Satz (0,01 Sek.) 
FEHLER: 
Keine Abfrage angegeben

Bei besonders großen Datenmengen sollten Sie auf die Verwendung gemeinsamer Abfragen verzichten, auch wenn Sie diese indiziert haben.

Das Obige ist nur eine kurze persönliche Zusammenfassung, die zur Diskussion anregen soll.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Analyse des ganz links stehenden Übereinstimmungsprinzips des MySQL-Gemeinschaftsindex
  • Detaillierte Erläuterung des MySQL-Kombinationsindex und des ganz links stehenden Übereinstimmungsprinzips
  • Eine kurze Diskussion über MySQL-Index-Designprinzipien und die Unterschiede zwischen gängigen Indizes
  • Beispielcode für das MySQL-Indexprinzip ganz links
  • Verstehen Sie die Prinzipien der MySQL-Indexerstellung in einem Artikel

<<:  Beispiel für das Schreiben von mobilem H5 zum Aufrufen einer APP (IOS, Android)

>>:  So konfigurieren Sie die virtuelle Benutzeranmeldung in vsftpd

Artikel empfehlen

Tutorial zur Installation von Elasticsearch 7.6.2 in Docker

Docker installieren Sie müssen Docker installiere...

JavaScript-Countdown zum Schließen von Anzeigen

Verwenden von Javascript zum Implementieren eines...

Mysql | Detaillierte Erklärung der Fuzzy-Abfrage mit Platzhaltern (wie, %, _)

Wildcard-Kategorien: %Prozent-Platzhalter: Gibt a...

Native JS-Implementierung der Slider-Intervallkomponente

In diesem Artikelbeispiel wird der spezifische Co...

W3C Tutorial (15): W3C SMIL Aktivitäten

SMIL fügt Unterstützung für Timing und Mediensync...

Detaillierte Erklärung zur Installation und Verwendung von Vue-Router

Inhaltsverzeichnis Installieren Grundlegende Konf...

Ideen zum Erstellen von Welleneffekten mit CSS

Zuvor habe ich mehrere Möglichkeiten vorgestellt,...

Detaillierte Erklärung von Javascript-Closures und -Anwendungen

Inhaltsverzeichnis Vorwort 1. Was ist ein Abschlu...

5 Möglichkeiten zur Migration von MySQL zu ClickHouse

Die Datenmigration muss von MySQL nach ClickHouse...