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

Vue3.0 Handschrift-Lupeneffekt

Der zu erzielende Effekt ist: Festes Vergrößern a...

VMware Workstation 14 Pro installiert CentOS 7.0

Die spezifische Methode zur Installation von Cent...

Einführung in das Layout des HTML-Seitenquellcodes_Powernode Java Academy

Einführung in das Layout des HTML-Seitenquellcode...

Grafisches Tutorial zur Installation von JDK1.8 unter CentOS7.4

Schritte zur Linux-Installation von JDK1.8 1. Übe...

Die konkrete Umsetzung des JavaScript-exklusiven Denkens

Im vorherigen Blog hat Xiao Xiong die Methoden ve...

Detaillierte Erläuterung der SSHD-Dienste und Dienstverwaltungsbefehle unter Linux

sshd SSH ist die Abkürzung für Secure Shell, ein ...

Detaillierte Erklärung zur Verwendung von ElementUI in Vue

Anmeldung + SessionStorage Effektanzeige Nach ein...

Lösung für den Fehler bei der Installation von Docker auf der CentOS-Version

1. Versionsinformationen # Katze /etc/system-rele...