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:
|
<<: So richten Sie einen URL-Link im Nginx-Server ein
>>: Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?
Inhaltsverzeichnis 1. Objektliterale 2. Das neue ...
Optimieren Sie die FastCGI-Konfigurationsdatei fc...
Verwenden Sie HSSFWorkbook in Apache.POI, um nach...
Dieses Tag ist nicht Teil von HTML3.2 und wird nu...
Dieser Artikel beschreibt anhand von Beispielen d...
1 Problembeschreibung Dieser Artikel sortiert den...
<textarea></textarea> wird verwendet,...
Inhaltsverzeichnis Was ist virtueller Dom? Warum ...
MySQL ist ein relationales Datenbankverwaltungssy...
Der Unterschied zwischen Inline-Elementen und Blo...
Vorwort Kürzlich wurde unser Server von Hackern a...
1. Einführung in Navicat 1. Was ist Navicat? Navi...
Es besteht ein Unterschied zwischen src und href ...
Chatbots können viel manuelle Arbeit sparen und i...
Vorwort Ich habe vor Kurzem Linux gelernt und dan...