Absteigender Index in MySQL 8.0

Absteigender Index in MySQL 8.0

Vorwort

Ich glaube, jeder weiß, dass Indizes geordnet sind. In früheren Versionen von MySQL wurden jedoch nur aufsteigende Indizes unterstützt, keine absteigenden Indizes, was zu einigen Problemen führen würde. In der neuesten Version von MySQL 8.0 wurden endlich absteigende Indizes eingeführt, und wir werden sie uns als Nächstes ansehen.

Absteigender Index

Einspaltiger Index

(1) Zeigen Sie die Struktur der Testtabelle an

mysql> zeigen erstellen Tabelle sbtest1\G
*************************** 1. Reihe ***************************
    Tabelle: sbtest1
Tabelle erstellen: CREATE TABLE `sbtest1` (
 `id` int unsigned NICHT NULL AUTO_INCREMENT,
 `k` int unsigned NICHT NULL STANDARD '0',
 `c` char(120) NICHT NULL STANDARD '',
 `pad` char(60) NICHT NULL STANDARD '',
 Primärschlüssel (`id`),
 SCHLÜSSEL `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci MAX_ROWS=1000000
1 Zeile im Satz (0,00 Sek.)

(2) Führen Sie die SQL-Anweisungen in der Reihenfolge ... Limit n aus. Die Standardeinstellung ist aufsteigende Reihenfolge, und der Index kann verwendet werden.

mysql> erläutern Sie „select * from sbtest1 order by k limit 10“;
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+------+------+------+
| 1 | EINFACH | sbtest1 | NULL | Index | NULL | k_1 | 4 | NULL | 10 | 100,00 | NULL |
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

(3) Führen Sie die SQL-Anweisung in der Reihenfolge ... desc limit n aus. Wenn die Reihenfolge absteigend ist, kann der Index nicht verwendet werden. Obwohl die umgekehrte Reihenfolge gescannt werden kann, wird die Leistung beeinträchtigt.

mysql> erläutern Sie „select * from sbtest1 order by k desc limit 10“;
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+----------+----------+---------------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+----------+----------+---------------------+
| 1 | SIMPLE | sbtest1 | NULL | index | NULL | k_1 | 4 | NULL | 10 | 100.00 | Rückwärts-Indexscan |
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+----------+----------+---------------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

(4) Erstellen Sie einen absteigenden Index

mysql> Tabelle ändern sbtest1 Index hinzufügen k_2(k desc);
Abfrage OK, 0 Zeilen betroffen (6,45 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(5) Führen Sie die SQL-Anweisung order by ... desc limit n erneut aus, und der absteigende Index kann verwendet werden.

mysql> erläutern Sie „select * from sbtest1 order by k desc limit 10“;
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+------+------+------+
| 1 | EINFACH | sbtest1 | NULL | Index | NULL | k_2 | 4 | NULL | 10 | 100,00 | NULL |
+----+----------+---------+------------+-------+---------------+-----------+---------+---------+------+---------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Mehrspaltige Indizes

(1) Zeigen Sie die Struktur der Testtabelle an

mysql> zeigen erstellen Tabelle sbtest1\G
*************************** 1. Reihe ***************************
    Tabelle: sbtest1
Tabelle erstellen: CREATE TABLE `sbtest1` (
 `id` int unsigned NICHT NULL AUTO_INCREMENT,
 `k` int unsigned NICHT NULL STANDARD '0',
 `c` char(120) NICHT NULL STANDARD '',
 `pad` char(60) NICHT NULL STANDARD '',
 Primärschlüssel (`id`),
 SCHLÜSSEL `k_1` (`k`),
 SCHLÜSSEL `idx_c_pad_1` (`c`,`pad`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci MAX_ROWS=1000000
1 Zeile im Satz (0,00 Sek.)

(2) Wenn bei mehrspaltigen Indizes kein absteigender Index vorhanden ist, kann nur SQL 1 den Index verwenden, SQL 4 kann in umgekehrter Reihenfolge scannen und die anderen beiden SQL-Anweisungen können nur einen vollständigen Tabellenscan durchführen, was sehr ineffizient ist.

SQL 1: Wählen Sie * aus sbtest1, sortiert nach c, Pad-Limit 10;

SQL 2: Wählen Sie * aus sbtest1, sortiert nach c, pad desc limit 10;

SQL 3: Wählen Sie * aus sbtest1, sortiert nach c desc, Pad-Limit 10;

SQL 4: Erläutern Sie „Select * from sbtest1“, sortieren Sie nach c desc, pad desc limit 10;

mysql> erläutern Sie „select * from sbtest1 order by c,pad limit 10“;
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| 1 | EINFACH | sbtest1 | NULL | Index | NULL | idx_c_pad_1 | 720 | NULL | 10 | 100,00 | NULL |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql> erläutern Sie „select * from sbtest1 order by c,pad desc limit 10;“
+----+----------+---------+------------+------+---------------+-----+---------+---------+---------+---------+----------+----------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+------+---------------+-----+---------+---------+---------+---------+----------+----------------+
| 1 | SIMPLE | sbtest1 | NULL | ALL | NULL | NULL | NULL | NULL | 950738 | 100.00 | Dateisortierung wird verwendet |
+----+----------+---------+------------+------+---------------+-----+---------+---------+---------+---------+----------+----------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql> erläutern Sie „select * from sbtest1 order by c desc,pad limit 10“;
+----+----------+---------+------------+------+---------------+-----+---------+---------+---------+---------+----------+----------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+------+---------------+-----+---------+---------+---------+---------+----------+----------------+
| 1 | SIMPLE | sbtest1 | NULL | ALL | NULL | NULL | NULL | NULL | 950738 | 100.00 | Dateisortierung wird verwendet |
+----+----------+---------+------------+------+---------------+-----+---------+---------+---------+---------+----------+----------------+
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

mysql> erläutern Sie die Auswahl * von sbtest1, sortiert nach c desc, pad desc limit 10;
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+------+---------+----------+----------+---------------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+------+---------+----------+----------+---------------------+
| 1 | SIMPLE | sbtest1 | NULL | index | NULL | idx_c_pad_1 | 720 | NULL | 10 | 100.00 | Rückwärts-Indexscan |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+------+---------+----------+----------+---------------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

(3) Erstellen Sie den entsprechenden absteigenden Index

mysql> Tabelle ändern sbtest1 Index hinzufügen idx_c_pad_2(c,pad desc);
Abfrage OK, 0 Zeilen betroffen (1 Min. 11,27 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> Tabelle ändern sbtest1 Index hinzufügen idx_c_pad_3(c desc,pad);
Abfrage OK, 0 Zeilen betroffen (1 Min. 14,22 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> Tabelle ändern sbtest1 Index hinzufügen idx_c_pad_4(c desc,pad desc);
Abfrage OK, 0 Zeilen betroffen (1 Min. 8,70 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(4) Wenn SQL erneut ausgeführt wird, kann der absteigende Index verwendet werden, was die Effizienz erheblich verbessert

mysql> erläutern Sie „select * from sbtest1 order by c,pad desc limit 10;“
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| 1 | EINFACH | sbtest1 | NULL | Index | NULL | idx_c_pad_2 | 720 | NULL | 10 | 100,00 | NULL |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql> erläutern Sie „select * from sbtest1 order by c desc,pad limit 10“;
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| 1 | EINFACH | sbtest1 | NULL | Index | NULL | idx_c_pad_3 | 720 | NULL | 10 | 100,00 | NULL |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql> erläutern Sie die Auswahl * von sbtest1, sortiert nach c desc, pad desc limit 10;
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
| 1 | EINFACH | sbtest1 | NULL | Index | NULL | idx_c_pad_4 | 720 | NULL | 10 | 100,00 | NULL |
+----+----------+---------+------------+-------+---------------+---------------+-------------+---------+---------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Zusammenfassen

Die wichtigste Funktion des in MySQL 8.0 eingeführten absteigenden Indexes besteht darin, das Problem zu lösen, dass der Index möglicherweise nicht für die Sortierung mehrerer Spalten verwendet wird, wodurch mehr Anwendungsszenarien abgedeckt werden.

Oben sind die Details zum absteigenden Index in MySQL 8.0 aufgeführt. Weitere Informationen zum absteigenden Index in MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Ausführliche Erläuterung versteckter Felder, einer neuen Funktion von MySQL 8.0
  • Detaillierte Erläuterung der zugrunde liegenden Implementierung des absteigenden Index, einer neuen Funktion von MySQL 8
  • Neue Funktionen in MySQL 8: Details zu absteigenden Indizes
  • Die drei neuen Indizes, die in MySQL 8 hinzugefügt wurden, sind versteckt, absteigend und Funktionen

<<:  So richten Sie einen URL-Link im Nginx-Server ein

>>:  Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?

Artikel empfehlen

Der grundlegendste Code für Webseiten

◆Zu Favoriten hinzufügen veranschaulichen Klicken...

MySQL 5.7.20 Win64 Installations- und Konfigurationsmethode

mysql-5.7.20-winx64.zipInstallationspaket ohne In...

Eine kurze Analyse der Unterschiede zwischen „:=“ und „=“ in MySQL

= Nur beim Setzen und Aktualisieren wirkt es wie ...

Der gesamte Prozessbericht der Vue-Exportfunktion für Excel

Inhaltsverzeichnis 1. Front-End-Führungsprozess: ...

Vue implementiert einen Countdown zwischen angegebenen Daten

In diesem Artikelbeispiel wird der spezifische Co...

MySQL ruft die aktuelle Datums- und Uhrzeitfunktion ab

Holen Sie sich das aktuelle Datum + die aktuelle ...

10 inhaltliche Prinzipien zur Verbesserung der Website-Performance

<br />Englische Adresse: http://developer.ya...

Implementierung der virtuellen React-Liste

Inhaltsverzeichnis 1. Hintergrund 2. Was ist eine...

Beispiel für die Verwendung eines manipulationssicheren JavaScript-Objekts

Inhaltsverzeichnis Manipulationssicheres Javascri...

Warum verwendet der MySQL-Datenbankindex den B+-Baum?

Bevor wir weiter analysieren, warum der MySQL-Dat...