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

DIV-Hintergrund, halbtransparenter Text, nicht durchscheinender Stil

Der DIV-Hintergrund ist halbtransparent, aber die ...

Wissenspunkte zum Prinzip der MySQL-Parallelitätskontrolle

Mysql ist eine gängige relationale Open-Source-Da...

So verwenden Sie DQL-Befehle zum Abfragen von Daten in MySQL

In diesem Artikel zeigt Ihnen der Blogger die häu...

Welche Vorteile bietet die Verwendung von B+Tree als Index in MySQL?

Inhaltsverzeichnis Warum benötigen Datenbanken In...

Analyse der Benutzererfahrung beim Design von Facebook-Dating-Websites

<br />Verwandter Artikel: Analyse der Inform...

Implementierung eines Puzzlespiels mit js

In diesem Artikel wird der spezifische Code von j...

Lösung für Win10 ohne Hyper-V

Suchen Sie immer noch nach einer Möglichkeit, Hyp...

Detaillierte Installation und Verwendung von Docker-Compose

Docker Compose ist ein Docker-Tool zum Definieren...