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

So testen Sie die maximale Anzahl von TCP-Verbindungen in Linux

Vorwort Es besteht ein Missverständnis bezüglich ...

Lösung für die geringe Schreibeffizienz von unter AIX gemountetem NFS

Von NFS bereitgestellte Dienste Mounten: Aktivier...

Das WeChat-Applet implementiert eine einfache Taschenrechnerfunktion

In diesem Artikel wird der spezifische Code für d...

Zusammenfassung der Unterschiede zwischen SQL und NoSQL

Hauptunterschiede: 1. Typ SQL-Datenbanken werden ...

MySQL-Startfehlerproblem und Szenarioanalyse

1. Komplettlösung 1. Problemanalyse und -lokalisi...

Reparaturlösung für inkonsistenten MySQL GTID-Master und -Slave

Inhaltsverzeichnis Lösung 1: Replikate neu erstel...

MySQL 5.6.37 (zip) Download Installationskonfiguration Grafik-Tutorial

In diesem Artikel finden Sie das Download-, Insta...

Detaillierte Erklärung der Komponentenkommunikation in React

Inhaltsverzeichnis Übergeordnete Komponente kommu...

Detaillierte Erläuterung der Angular-Strukturdirektivenmodule und -Stile

Inhaltsverzeichnis 1. Strukturelle Anweisungen Mo...

js verwendet die Reduce-Methode, um Ihren Code eleganter zu gestalten

Vorwort In tatsächlichen Projekten kann die häufi...