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

Installieren und konfigurieren Sie MySQL 5.7 unter CentOS 7

Dieser Artikel testet die Umgebung: CentOS 7 64-B...

Gründe, warum MySQL Kill Threads nicht beenden kann

Inhaltsverzeichnis Hintergrund Problembeschreibun...

Tutorial zu HTML-Formular-Tags (1):

Formulare sind eine wichtige externe Form zur Imp...

Detaillierte Erläuterung der Kernkonzepte und Fälle von webpack-dev-server

Kernkonzepte von webpack-dev-server Webpacks Cont...

7 Interviewfragen zu JS, wie viele können Sie richtig beantworten

Vorwort In JavaScript ist dies der Kontext zum Au...

Vue implementiert scrollbaren Popup-Fenstereffekt

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

MYSQL 5.6 Bereitstellung und Überwachung der Slave-Replikation

MYSQL 5.6 Bereitstellung und Überwachung der Slav...

Beheben von Problemen mit hoher MySQL-CPU-Auslastung

Hohe CPU-Last durch MySQL Heute Nachmittag habe i...

Spezielle Befehle in der MySql-Datenbankabfrage

Erstens: Installation von MySQL Laden Sie die MyS...