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

3 Möglichkeiten zum Erstellen von JavaScript-Objekten

Inhaltsverzeichnis 1. Objektliterale 2. Das neue ...

Java verwendet Apache.POI, um HSSFWorkbook nach Excel zu exportieren

Verwenden Sie HSSFWorkbook in Apache.POI, um nach...

Detaillierte Erklärung des Marquee-Attributs in HTML

Dieses Tag ist nicht Teil von HTML3.2 und wird nu...

Textarea-Tag in HTML

<textarea></textarea> wird verwendet,...

Detaillierte Erklärung zum virtuellen Javascript-DOM

Inhaltsverzeichnis Was ist virtueller Dom? Warum ...

Was macht die MySQL-Datenbank?

MySQL ist ein relationales Datenbankverwaltungssy...

Lösungen für Dateien/Ordner, die unter Linux nicht gelöscht werden können

Vorwort Kürzlich wurde unser Server von Hackern a...

Navicat Premium betreibt MySQL-Datenbank (führt SQL-Anweisungen aus)

1. Einführung in Navicat 1. Was ist Navicat? Navi...

Unterschied zwischen src- und href-Attributen

Es besteht ein Unterschied zwischen src und href ...

Fallstudie zur Implementierung eines jQuery Ajax-Chatbots

Chatbots können viel manuelle Arbeit sparen und i...