Index-Skip-Scan in MySQL 8.0

Index-Skip-Scan in MySQL 8.0

Vorwort

MySQL 8.0.13 unterstützt nun den Index-Skip-Scan, auch bekannt als Index-Jump-Scan. Diese Optimierungsmethode unterstützt Situationen, in denen das SQL nicht dem Prinzip des äußersten linken Präfixes des zusammengesetzten Index entspricht und der Optimierer den zusammengesetzten Index dennoch verwenden kann.

Reden ist billig, zeig mir den Code

üben

Verwenden Sie das Beispiel offizieller Dokumentation, um Daten zu konstruieren

mysql> TABELLE ERSTELLEN t1 (f1 INT NICHT NULL, f2 INT NICHT NULL, PRIMARY KEY(f1, f2));
Abfrage OK, 0 Zeilen betroffen (0,21 Sek.)
mysql> INSERT INTO t1 VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (2,1), (2,2), (2,3), (2,4), (2,5);
Abfrage OK, 10 Zeilen betroffen (0,07 Sek.)
Datensätze: 10 Duplikate: 0 Warnungen: 0
MySQL>
mysql> INSERT INTO t1 SELECT f1, f2 + 5 FROM t1;
Abfrage OK, 10 Zeilen betroffen (0,06 Sek.)
Datensätze: 10 Duplikate: 0 Warnungen: 0

mysql> INSERT INTO t1 SELECT f1, f2 + 10 FROM t1;
Abfrage OK, 20 Zeilen betroffen (0,03 Sek.)
Datensätze: 20 Duplikate: 0 Warnungen: 0

mysql> INSERT INTO t1 SELECT f1, f2 + 20 FROM t1;
Abfrage OK, 40 Zeilen betroffen (0,03 Sek.)
Datensätze: 40 Duplikate: 0 Warnungen: 0

mysql> INSERT INTO t1 SELECT f1, f2 + 40 FROM t1;
Abfrage OK, 80 Zeilen betroffen (0,05 Sek.)
Datensätze: 80 Duplikate: 0 Warnungen: 0

Beachten Sie, dass der Primärschlüssel der Tabelle t1 ein zusammengesetzter Index (f1, f2) ist. Wenn die Where-Bedingung in SQL nicht das am weitesten links stehende Präfix f1 enthält, wird in früheren Versionen ein FULL TABLE SCAN ausgeführt. Was wird in MySQL 8.0.20 passieren? Schauen wir uns den Ausführungsplan an

mysql> ERKLÄREN SIE SELECT f1, f2 FROM t1 WHERE f2 = 40\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t1
  Partitionen: NULL
     Typ: Bereich
mögliche Schlüssel: PRIMARY
     Schlüssel: PRIMARY
   Schlüssellänge: 8
     Ref: NULL
     Reihen: 16
   gefiltert: 100,00
    Extra: Verwenden von „where“; Verwenden von Index für Skip-Scan
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

mysql> ERKLÄREN SIE SELECT f1, f2 FROM t1 WHERE f2 > 40\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t1
  Partitionen: NULL
     Typ: Bereich
mögliche Schlüssel: PRIMARY
     Schlüssel: PRIMARY
   Schlüssellänge: 8
     Ref: NULL
     Reihen: 53
   gefiltert: 100,00
    Extra: Verwenden von „where“; Verwenden von Index für Skip-Scan
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Die Ausführungspläne der beiden SQL-Anweisungen, bei denen die Bedingungen f2>40 und f2=40 gelten, enthalten beide „Index für Skip-Scan verwenden“ und „Typ ist Bereich“.

Der gesamte Ausführungsplan sieht wie folgt aus:

Der erste Scan beginnt auf der linken Seite des Index
Beim zweiten Mal verwenden Sie key(1,40), um den Index zu scannen, bis der erste Bereich endet. Verwenden Sie key(1), find_flag =HA_READ_AFTER_KEY und suchen Sie den nächsten Schlüsselwert 2
Verwenden Sie key(2,40), um den Index zu scannen, bis der Bereich endet. Verwenden Sie key(2), um einen Schlüsselwert größer als 2 zu finden. Im obigen Beispiel gibt es keinen solchen Wert, daher wird der Scan beendet.

Aus der obigen Beschreibung können wir erkennen, dass durch die Verwendung des Skip-Scans ein vollständiger Index-Scan vermieden wird und dadurch die Leistung verbessert wird.

Wenn die Funktion skip_scan “ deaktiviert ist, wird der Ausführungsplan zu „type=all, extre using where full table scan“.

mysql> setze Sitzungsoptimierer_schalter='skip_scan=off';
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> ERKLÄREN SIE SELECT * FROM t1 WHERE f2 = 40\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t1
  Partitionen: NULL
     Typ: ALLE
mögliche Schlüssel: NULL
     Schlüssel: NULL
   key_len: NULL
     Ref: NULL
     Reihen: 160
   gefiltert: 10.00
    Extra: Verwenden von „where“
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Einschränkungen

1. Die ausgewählten Felder dürfen keine Nichtindexfelder enthalten

Wenn sich das Feld c1 beispielsweise im zusammengesetzten Index befindet, kann die Funktion „Select * SQL“ den Scan nicht überspringen.

mysql> ERKLÄREN SIE SELECT * FROM t1 WHERE f2 = 40\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t1
  Partitionen: NULL
     Typ: ALLE
mögliche Schlüssel: NULL
     Schlüssel: NULL
   key_len: NULL
     Ref: NULL
     Reihen: 160
   gefiltert: 10.00
    Extra: Verwenden von „where“
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

2. SQL darf keine Group-By- oder Distinct-Syntax enthalten

mysql> ERKLÄREN SELECT distinct f1 FROM t1 WHERE f2 = 40\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t1
  Partitionen: NULL
     Typ: Bereich
mögliche Schlüssel: PRIMARY
     Schlüssel: PRIMARY
   Schlüssellänge: 8
     Ref: NULL
     Reihen: 3
   gefiltert: 100,00
    Extra: Verwenden von „where“; Verwenden von „index“ für „group-by“
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

3. Der Skip-Scan unterstützt nur Einzeltabellenabfragen und kann nicht für die Zuordnung mehrerer Tabellen verwendet werden.

4. Für den zusammengesetzten Index ([A_1, …, A_k,] B_1, …, B_m, C [, D_1, …, D_n]) können A und D leer sein, die Felder B und C jedoch nicht leer sein.

Es ist wichtig zu betonen, dass es für die Datenbankoptimierung kein Patentrezept gibt. Der MySQL-Optimierer wählt den geeigneten Ausführungsplan auf Basis der Kosten aus. Nicht alle bedingten Abfragen, die das äußerste linke Präfix ignorieren, können den Index-Skip-Scan nutzen.

Zum Beispiel:

mysql> TABELLE ERSTELLEN `t3` 
(id int nicht null auto_increment PRIMARY KEY,  
`f1` int NICHT NULL,  
`f2` int NICHT NULL, 
`c1` int DEFAULT '0', 
Schlüssel idx_f12(`f1`,`f2`,c1) ) 
ENGINE=InnoDB STANDARD-CHARSET=utf8mb4;
Abfrage OK, 0 Zeilen betroffen (0,24 Sek.)

mysql> einfügen in t3(f1,f2,c1) wähle f1,f2,c1 aus t1;
Abfrage OK, 320 Zeilen betroffen (0,07 Sek.)
Datensätze: 320 Duplikate: 0 Warnungen: 0

Die Datenmenge verdoppelt sich auf 320 Zeilen. Zu diesem Zeitpunkt verwendet die Abfrage f2 = 40 keinen Index-Skip-Scan.

mysql> erklären select f2 from t3 where f2=40 \G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t3
  Partitionen: NULL
     Typ: Index
mögliche Tastenkombinationen: idx_f12
     Schlüssel: idx_f12
   Schlüssellänge: 13
     Ref: NULL
     Reihen: 320
   gefiltert: 10.00
    Extra: Verwenden von „where“; Verwenden von „index“
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

-Das Ende-

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

Das könnte Sie auch interessieren:
  • Mehrere Situationen, die dazu führen, dass MySQL einen vollständigen Tabellenscan durchführt
  • So verbessern Sie die Geschwindigkeit des vollständigen Tabellenscans von InnoDB in MySQL erheblich
  • MySQL-Sortierung mittels Index-Scan
  • Detaillierte Beispiele für den vollständigen Tabellenscan und den Indexbaumscan in MySQL

<<:  So überwachen Sie MySQL mit Zabbix

>>:  Grundlegendes zur JavaScript-Prototypenkette

Artikel empfehlen

Docker-Installationsschritte für Redmine

Laden Sie das Image herunter (optionaler Schritt,...

Detaillierte Erklärung zur Verwendung von Filtereigenschaften in CSS3

Als ich kürzlich das Intranet-Portal änderte, sti...

Fünf praktische Tipps zur Gestaltung von Webformularen

1. Mobile Auswahl der Formulartexteingabe: Wenn i...

Natives JS zur Implementierung des Flugzeug-Kriegsspiels

In diesem Artikelbeispiel wird der spezifische JS...

Detaillierte Erklärung der Vue-Optionen

Inhaltsverzeichnis 1. Was sind Optionen? 2. Welch...

Verwendung und Demonstration von ref in Vue

Ref-Definition: Wird verwendet, um Referenzinform...

CentOS 6 verwendet Docker zum Bereitstellen eines Zookeeper-Betriebsbeispiels

Dieser Artikel beschreibt, wie man mit Docker Zoo...

LinkedIn wird überarbeitet, um das Surfen auf der Website zu vereinfachen

Das geschäftliche Social-Networking-Portal Linked...

Die Bilder in HTML werden direkt durch base64-kodierte Strings ersetzt

Kürzlich stieß ich auf eine Webseite, die zwar Bil...