Die drei neuen Indizes, die in MySQL 8 hinzugefügt wurden, sind versteckt, absteigend und Funktionen

Die drei neuen Indizes, die in MySQL 8 hinzugefügt wurden, sind versteckt, absteigend und Funktionen

Versteckte, absteigende und funktionale Indizes in MySQL 8

1. Versteckter Index

1. Übersicht über versteckte Indizes

  • MySQL 8.0 begann, unsichtbare Indizes zu unterstützen.
  • Versteckte Indizes werden vom Optimierer nicht verwendet, müssen aber trotzdem gepflegt werden.
  • Anwendungsszenarien: Sanftes Löschen und Graustufenfreigabe.

In früheren MySQL-Versionen konnten Indizes nur explizit gelöscht werden. Wenn festgestellt wurde, dass der falsche Index gelöscht wurde, konnte der gelöschte Index nur durch Erstellen eines Indexes wieder hinzugefügt werden. Wenn die Datenmenge in der Datenbank sehr groß oder die Tabelle groß war, war der Aufwand für diesen Vorgang sehr hoch.

In MySQL 8.0 müssen Sie diesen Index nur als versteckten Index festlegen, damit der Abfrageoptimierer diesen Index nicht mehr verwendet. Dieser Index muss jedoch weiterhin vom MySQL-Hintergrund verwaltet werden. Wenn bestätigt ist, dass das Festlegen dieses Indexes als versteckter Index keine Auswirkungen auf das System hat, löschen Sie den Index vollständig. Dies ist die Soft-Delete-Funktion.

Graustufenfreigabe bedeutet, dass beim Erstellen eines Indexes dieser zunächst als versteckter Index festgelegt wird und dann der versteckte Index durch Ändern des Abfrageoptimiererschalters für den Abfrageoptimierer sichtbar gemacht wird. Testen Sie den Index anschließend durch Erklären, um zu bestätigen, dass der Index gültig ist. Wenn der Index in bestimmten Abfragen verwendet werden kann, kann er als sichtbarer Index festgelegt werden, um den Graustufenfreigabeeffekt zu erzielen.

2. Indexvorgänge ausblenden

(1) Melden Sie sich bei MySQL an, erstellen Sie eine Testdb-Datenbank und erstellen Sie eine Testtabelle t1 in der Datenbank

mysql> Datenbank erstellen, falls nicht vorhanden, testdb;
Abfrage OK, 1 Zeile betroffen (0,58 Sek.)
mysql> testdb verwenden;
Datenbank geändert
mysql> Tabelle erstellen, falls nicht vorhanden, t1(i int, j int);
Abfrage OK, 0 Zeilen betroffen (0,05 Sek.)

(2) Erstellen Sie einen Index für das Feld i, wie unten gezeigt.

mysql> erstelle Index i_idx auf t1(i);
Abfrage OK, 0 Zeilen betroffen (0,34 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(3) Erstellen Sie einen versteckten Index für Feld j. Um einen versteckten Index zu erstellen, fügen Sie einfach das Schlüsselwort invisible nach der Anweisung zum Erstellen des Index hinzu, wie unten gezeigt:

mysql> erstelle Index j_idx auf t1(j) unsichtbar;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(4) Überprüfen Sie den Indexstatus in Tabelle t1, wie unten gezeigt

mysql> Index von t1 \G anzeigen
*************************** 1. Reihe ***************************
        Tabelle: t1
   Nicht_eindeutig: 1
     Schlüsselname: i_idx
 Seq_in_index: 1
  Spaltenname: i
    Sortierung: A
  Kardinalität: 0
     Unterteil: NULL
       Gepackt: NULL
         Null: JA
   Indextyp: BTREE
      Kommentar: 
Index_Kommentar: 
      Sichtbar: JA
   Ausdruck: NULL
*************************** 2. Reihe ***************************
        Tabelle: t1
   Nicht_eindeutig: 1
     Schlüsselname: j_idx
 Seq_in_index: 1
  Spaltenname: j
    Sortierung: A
  Kardinalität: 0
     Unterteil: NULL
       Gepackt: NULL
         Null: JA
   Indextyp: BTREE
      Kommentar: 
Index_Kommentar: 
      Sichtbar: NEIN
   Ausdruck: NULL
2 Zeilen im Satz (0,02 Sek.)

Sie können sehen, dass es in der Tabelle t1 zwei Indizes gibt, einen ist i_idx und einen ist j_idx. Das Visible-Attribut von i_idx ist YES, was bedeutet, dass dieser Index sichtbar ist; das Visibles-Attribut von j_idx ist NO, was bedeutet, dass dieser Index unsichtbar ist.

(5) Überprüfen Sie, wie der Abfrageoptimierer diese beiden Indizes verwendet.

Führen Sie zunächst eine Abfrage mit Feld i durch, wie unten gezeigt.

mysql> erklären select * from t1 where i = 1 \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t1
   Partitionen: NULL
         Typ: ref
mögliche Schlüssel: i_idx
          Schlüssel: i_idx
      Schlüssellänge: 5
          Verweis: const
         Reihen: 1
     gefiltert: 100,00
        Extra: NULL
1 Zeile im Satz, 1 Warnung (0,02 Sek.)

Wie Sie sehen, verwendet der Abfrageoptimierer den Index des i-Felds zur Optimierung.
Führen Sie als Nächstes eine Abfrage mit Feld j durch, wie unten gezeigt.

mysql> erklären select * from t1 where j = 1 \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: 1
     gefiltert: 100,00
        Extra: Verwenden von „where“
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Es ist ersichtlich, dass der Abfrageoptimierer den versteckten Index im Feld j nicht verwendet und einen vollständigen Tabellenscan zum Abfragen der Daten verwendet.

(6) Versteckte Indizes für den Optimierer sichtbar machen

In MySQL 8.x wird eine neue Testmethode bereitgestellt, mit der über einen Schalter des Optimierers eine Einstellung aktiviert werden kann, um versteckte Indizes für den Abfrageoptimierer sichtbar zu machen.
Zeigen Sie die Schalter des Abfrageoptimierers wie unten dargestellt an.

mysql> wähle @@optimizer_switch \G 
*************************** 1. Reihe ***************************
@@optimizer_switch: index_merge=ein,index_merge_union=ein,index_merge_sort_union=ein,index_merge_intersection=ein,engine_condition_pushdown=ein,index_condition_pushdown=ein,mrr=ein,mrr_cost_based=ein,block_nested_loop=ein,batched_key_access=aus,materialization=ein,semijoin=ein,loosescan=ein,firstmatch=ein,duplicateweedout=ein,subquery_materialization_cost_based=ein,use_index_extensions=ein,condition_fanout_filter=ein,derived_merge=ein,use_invisible_indexes=aus,skip_scan=ein,hash_join=ein
1 Zeile im Satz (0,00 Sek.)

Hier sehen Sie den folgenden Eigenschaftswert:

use_invisible_indexes=aus

Gibt an, ob der Optimierer unsichtbare Indizes verwendet. Die Standardeinstellung ist „Aus“.
Aktivieren Sie als Nächstes den Abfrageoptimierer, um den unsichtbaren Index auf MySQL-Sitzungsebene zu verwenden, wie unten gezeigt.

mysql> setze Sitzung optimizer_switch="use_invisible_indexes=on";
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Überprüfen Sie als nächstes die Schaltereinstellungen des Abfrageoptimierers erneut, wie unten gezeigt

mysql> wähle @@optimizer_switch \G
*************************** 1. Reihe ***************************
@@optimizer_switch: index_merge=ein,index_merge_union=ein,index_merge_sort_union=ein,index_merge_intersection=ein,engine_condition_pushdown=ein,index_condition_pushdown=ein,mrr=ein,mrr_cost_based=ein,block_nested_loop=ein,batched_key_access=aus,materialization=ein,semijoin=ein,loosescan=ein,firstmatch=ein,duplicateweedout=ein,subquery_materialization_cost_based=ein,use_index_extensions=ein,condition_fanout_filter=ein,derived_merge=ein,use_invisible_indexes=ein,skip_scan=ein,hash_join=ein
1 Zeile im Satz (0,00 Sek.)

An diesem Punkt können Sie use_invisible_indexes=on sehen, was bedeutet, dass der versteckte Index für den Abfrageoptimierer sichtbar ist.

Lassen Sie uns die Daten erneut mithilfe des Felds j der Tabelle t1 analysieren, wie unten gezeigt.

mysql> erklären select * from t1 where j = 1 \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t1
   Partitionen: NULL
         Typ: ref
mögliche Schlüssel: j_idx
          Schlüssel: j_idx
      Schlüssellänge: 5
          Verweis: const
         Reihen: 1
     gefiltert: 100,00
        Extra: NULL
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Es ist ersichtlich, dass der Abfrageoptimierer den versteckten Index im Feld j verwendet, um die Abfrage zu optimieren.

(7) Sichtbarkeit des Index festlegen

Setzen Sie den versteckten Index im Feld j auf sichtbar, wie unten gezeigt.

mysql> Tabelle t1 ändern, Index j_idx sichtbar ändern;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

Setzen Sie den Index für Feld j auf unsichtbar, wie unten gezeigt.

mysql> Tabelle t1 ändern, Index j_idx unsichtbar ändern;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(8) Der Primärschlüssel in MySQL kann nicht als unsichtbarer Index festgelegt werden

Es ist erwähnenswert, dass in MySQL der Primärschlüssel nicht auf unsichtbar gesetzt werden kann.
Erstellen Sie wie unten gezeigt eine Testtabelle t2 in der Testdb-Datenbank.

mysql> Tabelle t2 erstellen (i int ungleich null);
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

Als nächstes erstellen Sie einen unsichtbaren Primärschlüssel in der Tabelle t2 wie folgt

mysql> Tabelle t2 ändern, Primärschlüssel pk_t2(i) hinzufügen, unsichtbar; 
FEHLER 3522 (HY000): Ein Primärschlüsselindex kann nicht unsichtbar sein

Es ist ersichtlich, dass die SQL-Anweisung zu diesem Zeitpunkt einen Fehler meldet und der Primärschlüssel nicht als unsichtbarer Index festgelegt werden kann.

2. Absteigender Index

1. Übersicht über den absteigenden Index

  • MySQL 8.0 begann, absteigende Indizes wirklich zu unterstützen.
  • Nur die InnoDB-Speicher-Engine unterstützt absteigende Indizes, und es werden nur absteigende BTREE-Indizes unterstützt.
  • MySQL 8.0 führt bei GROUP BY-Operationen keine implizite Sortierung mehr durch

2. Absteigender Indexvorgang

(1) In MySQL 5.7 unterstützte Syntax

Erstellen Sie zunächst eine Testdatenbank testdb in MySQL 5.7 und erstellen Sie eine Testtabelle t2 in der Datenbank testdb, wie unten gezeigt.

mysql> Datenbank erstellen, falls nicht vorhanden, testdb;
Abfrage OK, 0 Zeilen betroffen (0,71 Sek.)
mysql> testdb verwenden;
Datenbank geändert
mysql> Tabelle erstellen, falls nicht vorhanden: t2(c1 int, c2 int, Index idx1(c1 asc, c2 desc));
Abfrage OK, 0 Zeilen betroffen (0,71 Sek.)

In der Tabelle t2 wird ein Index mit dem Namen idx1 erstellt. Das Feld c1 im Index wird in aufsteigender Reihenfolge sortiert, und das Feld c2 wird in absteigender Reihenfolge sortiert.

Sehen Sie sich als Nächstes die Erstellungsinformationen der t2-Tabelle an, wie unten gezeigt

mysql> anzeigen, Tabelle erstellen t2 \G
*************************** 1. Reihe ***************************
       Tabelle: t2
Tabelle erstellen: CREATE TABLE `t2` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  SCHLÜSSEL `idx1` (`c1`,`c2`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8mb4
1 Zeile im Satz (0,16 Sek.)

Es ist ersichtlich, dass in den Informationen zur Tabellenerstellung von MySQL Version 5.7 keine Sortierinformationen für die Felder c1 und c2 vorhanden sind und die Standardeinstellung die aufsteigende Reihenfolge ist.

(2) In MySQL 8.0 unterstützte Syntax

Erstellen Sie in MySQL 8.x die Tabelle t2 wie folgt

mysql> Tabelle erstellen, falls nicht vorhanden: t2(c1 int, c2 int, Index idx1(c1 asc, c2 desc));
Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,00 Sek.)

Sehen Sie sich als Nächstes die Erstellungsinformationen der t2-Tabelle an, wie unten gezeigt

mysql> anzeigen, Tabelle erstellen t2 \G
*************************** 1. Reihe ***************************
       Tabelle: t2
Tabelle erstellen: CREATE TABLE `t2` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  SCHLÜSSEL `idx1` (`c1`,`c2` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 Zeile im Satz (0,00 Sek.)

Wie Sie sehen, enthält der erstellte Index in MySQL 8.x die Sortierinformationen der Felder.

(3) Verwendung von Indizes durch den Abfrageoptimierer in MySQL 5.7

Fügen Sie zunächst einige Daten in Tabelle t2 ein, wie unten gezeigt.

mysql> einfügen in t2(c1, c2) Werte(1, 100), (2, 200), (3, 150), (4, 50);
Abfrage OK, 4 Zeilen betroffen (0,19 Sek.)
Datensätze: 4 Duplikate: 0 Warnungen: 0

Fragen Sie als Nächstes die Daten in der Tabelle t2 wie unten gezeigt ab.

mysql> wähle * aus t2;
+------+------+
| c1 | c2 |
+------+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 150 |
| 4 | 50 |
+------+------+
4 Zeilen im Satz (0,00 Sek.)

Wie Sie sehen, wurden die Daten erfolgreich in die Tabelle t2 eingefügt.

Überprüfen Sie als Nächstes die Verwendung des Index durch den Abfrageoptimierer. Hier ist die Abfrageanweisung in aufsteigender Reihenfolge nach dem Feld c1 und in absteigender Reihenfolge nach dem Feld c2, wie unten gezeigt.

mysql> erklären select * from t2 order by c1, c2 desc \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t2
   Partitionen: NULL
         Typ: Index
mögliche Schlüssel: NULL
          Schlüssel: idx1
      Schlüssellänge: 10
          Ref: NULL
         Reihen: 4
     gefiltert: 100,00
        Extra: Index verwenden; Filesort verwenden
1 Zeile im Satz, 1 Warnung (0,12 Sek.)

Wie Sie sehen, wird in MySQL 5.7 das Feld c2 in absteigender Reihenfolge sortiert, ohne einen Index zu verwenden.

(4) Die Verwendung absteigender Indizes durch den Abfrageoptimierer in MySQL 8.x.

Überprüfen Sie die Verwendung absteigender Indizes durch den Abfrageoptimierer.
Fügen Sie zunächst einige Daten in Tabelle t2 ein, wie unten gezeigt.

mysql> einfügen in t2(c1, c2) Werte(1, 100), (2, 200), (3, 150), (4, 50);
Abfrage OK, 4 Zeilen betroffen (0,00 Sek.)
Datensätze: 4 Duplikate: 0 Warnungen: 0

Fragen Sie als Nächstes die Daten in der Tabelle t2 wie unten gezeigt ab.

mysql> wähle * aus t2;
+------+------+
| c1 | c2 |
+------+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 150 |
| 4 | 50 |
+------+------+
4 Zeilen im Satz (0,00 Sek.)

Wie Sie sehen, wurden die Daten erfolgreich in die Tabelle t2 eingefügt.

Wenn Sie in MySQL einen aufsteigenden Index erstellen, können Sie beim Angeben einer Abfrage die Abfrage nur in aufsteigender Reihenfolge angeben, sodass der aufsteigende Index verwendet werden kann.

Überprüfen Sie als Nächstes die Verwendung des Index durch den Abfrageoptimierer. Hier ist die Abfrageanweisung in aufsteigender Reihenfolge nach dem Feld c1 und in absteigender Reihenfolge nach dem Feld c2, wie unten gezeigt.

mysql> erklären select * from t2 order by c1, c2 desc \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t2
   Partitionen: NULL
         Typ: Index
mögliche Schlüssel: NULL
          Schlüssel: idx1
      Schlüssellänge: 10
          Ref: NULL
         Reihen: 4
     gefiltert: 100,00
        Extra: Index verwenden
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Wie Sie sehen, wird das Feld c2 in MySQL 8.x unter Verwendung des Index in absteigender Reihenfolge sortiert.

Sortieren Sie, indem Sie das Feld c1 in absteigender Reihenfolge und das Feld c2 in aufsteigender Reihenfolge verwenden, wie unten gezeigt.

mysql> erklären select * from t2 order by c1 desc, c2 \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t2
   Partitionen: NULL
         Typ: Index
mögliche Schlüssel: NULL
          Schlüssel: idx1
      Schlüssellänge: 10
          Ref: NULL
         Reihen: 4
     gefiltert: 100,00
        Extra: Rückwärts-Index-Scan; Index verwenden
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Wie Sie sehen, kann der Index weiterhin in MySQL 8.x verwendet werden und es wird der umgekehrte Scan des Indexes verwendet.

(5) MySQL 8.x sortiert GROUP BY-Anweisungen nicht mehr implizit

Führen Sie den folgenden Befehl in MySQL 5.7 aus, um nach dem Feld c2 zu gruppieren und die Anzahl der Datensätze in jeder Gruppe abzufragen.

mysql> wähle count(*), c2 aus t2, gruppiere nach c2;
+----------+------+
| Anzahl(*) | c2 |
+----------+------+
| 1 | 50 |
| 1 | 100 |
| 1 | 150 |
| 1 | 200 |
+----------+------+
4 Reihen im Satz (0,18 Sek.)

Wie Sie sehen, wird in MySQL 5.7 ein Sortiervorgang für das Feld c2 ausgeführt.

Führen Sie den folgenden Befehl in MySQL 8.x aus, um nach dem Feld c2 zu gruppieren und die Anzahl der Datensätze in jeder Gruppe abzufragen.

mysql> wähle count(*), c2 aus t2, gruppiere nach c2;
+----------+------+
| Anzahl(*) | c2 |
+----------+------+
| 1 | 100 |
| 1 | 200 |
| 1 | 150 |
| 1 | 50 |
+----------+------+
4 Zeilen im Satz (0,00 Sek.)

Wie Sie sehen, wird in MySQL 8.x kein Sortiervorgang im Feld c2 durchgeführt.

Wenn Sie in MySQL 8.x das Feld c2 sortieren müssen, müssen Sie die Sortierregeln mit der Anweisung „order by“ explizit angeben, wie unten gezeigt.

mysql> wähle Anzahl(*), c2 aus t2, Gruppierung nach c2, Sortierung nach c2;
+----------+------+
| Anzahl(*) | c2 |
+----------+------+
| 1 | 50 |
| 1 | 100 |
| 1 | 150 |
| 1 | 200 |
+----------+------+
4 Zeilen im Satz (0,00 Sek.)

3. Funktionsindex

1. Übersicht über den Funktionsindex

  • MySQL 8.0.13 unterstützt nun die Verwendung von Funktionswerten (Ausdrücken) in Indizes.
  • Unterstützt absteigenden Index und JSON-Datenindex
  • Der funktionale Index wird basierend auf der virtuellen Spaltenfunktion implementiert

2. Funktionsindexoperation

(1) Testtabelle t3 erstellen

Erstellen Sie wie unten gezeigt eine Testtabelle t3 in der Testdb-Datenbank.

mysql> Tabelle erstellen, falls nicht vorhanden t3(c1 varchar(10), c2 varchar(10));
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

(2) Erstellen Sie einen normalen Index

Erstellen Sie einen normalen Index für das Feld c1

mysql> erstelle Index idx1 auf t3(c1);
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(3) Erstellen Sie einen Funktionsindex

Erstellen Sie einen funktionalen Index für das Feld c2, der den Feldwert wie unten gezeigt in Großbuchstaben umwandelt.

mysql> Index erstellen func_index auf t3 ((UPPER(c2)));
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

(4) Zeigen Sie die Indexinformationen in der Tabelle t3 an, wie unten gezeigt.

mysql> Index von t3 \G anzeigen
*************************** 1. Reihe ***************************
        Tabelle: t3
   Nicht_eindeutig: 1
     Schlüsselname: idx1
 Seq_in_index: 1
  Spaltenname: c1
    Sortierung: A
  Kardinalität: 0
     Unterteil: NULL
       Gepackt: NULL
         Null: JA
   Indextyp: BTREE
      Kommentar: 
Index_Kommentar: 
      Sichtbar: JA
   Ausdruck: NULL
*************************** 2. Reihe ***************************
        Tabelle: t3
   Nicht_eindeutig: 1
     Schlüsselname: func_index
 Seq_in_index: 1
  Column_name: NULL
    Sortierung: A
  Kardinalität: 0
     Unterteil: NULL
       Gepackt: NULL
         Null: JA
   Indextyp: BTREE
      Kommentar: 
Index_Kommentar: 
      Sichtbar: JA
   Ausdruck: upper(`c2`)
2 Zeilen im Satz (0,01 Sek.)

(5) Überprüfen Sie die Verwendung der beiden Indizes durch den Abfrageoptimierer

Überprüfen Sie zunächst, ob der Großbuchstabenwert des Felds c1 einem bestimmten Wert entspricht, wie unten gezeigt.

mysql> erklären select * from t3 where upper(c1) = 'ABC' \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t3
   Partitionen: NULL
         Typ: ALLE
mögliche Schlüssel: NULL
          Schlüssel: NULL
      key_len: NULL
          Ref: NULL
         Reihen: 1
     gefiltert: 100,00
        Extra: Verwenden von „where“
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Wie Sie sehen, wird kein Index verwendet und ein vollständiger Tabellenscanvorgang durchgeführt.

Überprüfen Sie als Nächstes, ob der Großbuchstabenwert des Felds c2 einem bestimmten Wert entspricht, wie unten gezeigt.

mysql> erklären select * from t3 where upper(c2) = 'ABC' \G 
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t3
   Partitionen: NULL
         Typ: ref
mögliche Schlüssel: func_index
          Schlüssel: func_index
      Schlüssellänge: 43
          Verweis: const
         Reihen: 1
     gefiltert: 100,00
        Extra: NULL
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Wie Sie sehen, wird ein funktionaler Index verwendet.

(6) Funktionsindex für JSON-Daten

Erstellen Sie zunächst eine Testtabelle emp und indizieren Sie die JSON-Daten wie unten gezeigt.

mysql> Tabelle erstellen, falls nicht vorhanden: emp(data json, index((CAST(data->>'$.name' as char(30)))));
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)

Die obigen SQL-Anweisungen werden wie folgt erklärt:

  • Die Länge der JSON-Daten ist nicht festgelegt. Wenn Sie die JSON-Daten direkt indizieren, können sie die Indexlänge überschreiten. Normalerweise wird nur ein Teil der JSON-Daten zur Indizierung abgefangen.
  • Die Typkonvertierungsfunktion CAST() konvertiert Daten in den Typ char(30). Die Verwendungsmethode ist CAST (Daten als Datentyp).
  • data ->> '$.name' stellt den JSON-Operator dar

Einfach ausgedrückt nimmt es den Wert des Namensknotens und konvertiert ihn in den Typ char(30).

Überprüfen Sie als Nächstes den Indexstatus in der Emp-Tabelle, wie unten gezeigt.

mysql> Index von emp \G anzeigen
*************************** 1. Reihe ***************************
        Tabelle: emp
   Nicht_eindeutig: 1
     Schlüsselname: Funktionsindex
 Seq_in_index: 1
  Column_name: NULL
    Sortierung: A
  Kardinalität: 0
     Unterteil: NULL
       Gepackt: NULL
         Null: JA
   Indextyp: BTREE
      Kommentar: 
Index_Kommentar: 
      Sichtbar: JA
   Ausdruck: cast(json_unquote(json_extract(`data`,_utf8mb4\'$.name\')) as char(30) charset utf8mb4)
1 Zeile im Satz (0,00 Sek.)

(7) Der funktionale Index wird basierend auf virtuellen Spalten implementiert

Sehen Sie sich zunächst die Informationen der t3-Tabelle an, wie unten dargestellt.

mysql> Beschreibung t3;
+----------+----------+------+-----+---------+---------+-----------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+----------+----------+------+-----+---------+---------+-----------+
| c1 | varchar(10) | JA | MUL | NULL | |
| c2 | varchar(10) | JA | | NULL | |
+----------+----------+------+-----+---------+---------+-----------+
2 Zeilen im Satz (0,00 Sek.)

Auf c1 wird ein gemeinsamer Index und auf c2 ein funktionaler Index erstellt.

Fügen Sie als Nächstes der Tabelle t3 eine Spalte c3 hinzu, um den Funktionsindex auf c2 zu simulieren, wie unten gezeigt.

mysql> alter table t3 add column c3 varchar(10) wird immer als (upper(c1)) generiert;
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

Spalte c3 ist eine berechnete Spalte. Der Wert des Felds c3 ist immer das Ergebnis der Konvertierung des Felds c1 in Großbuchstaben.

Als nächstes fügen Sie ein Datenelement in die Tabelle t3 ein. Die Spalte c3 ist eine berechnete Spalte. Der Wert des Felds c3 ist immer das Ergebnis der Konvertierung des Felds c1 in Großbuchstaben. Beim Einfügen von Daten müssen Sie, wie unten gezeigt, keine Daten in die Spalte c3 einfügen.

mysql> in t3(c1, c2) Werte einfügen ('abc', 'def');
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

Fragen Sie die Daten in der t3-Tabelle wie unten gezeigt ab.

mysql> wähle * aus t3;
+------+------+------+
| c1 | c2 | c3 |
+------+------+------+
| abc | def | ABC |
+------+------+------+
1 Zeile im Satz (0,00 Sek.)

Es ist ersichtlich, dass es nicht notwendig ist, Daten in Spalte c3 einzufügen. Die Daten in Spalte c3 sind die Ergebnisdaten in Großbuchstaben des Felds c1.

Wenn Sie die Wirkung eines funktionalen Indexes simulieren möchten, können Sie die folgende Methode verwenden.
Fügen Sie zunächst wie unten gezeigt einen Index für die Spalte c3 hinzu.

mysql> erstelle Index idx3 auf t3(c3);
Abfrage OK, 0 Zeilen betroffen (0,11 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

Überprüfen Sie als Nächstes erneut, ob der Großbuchstabenwert des Felds c1 einem bestimmten Wert entspricht, wie unten gezeigt.

mysql> erklären select * from t3 where upper(c1) = 'ABC' \G
*************************** 1. Reihe ***************************
           ID: 1
  select_type: EINFACH
        Tabelle: t3
   Partitionen: NULL
         Typ: ref
mögliche Schlüssel: idx3
          Schlüssel: idx3
      Schlüssellänge: 43
          Verweis: const
         Reihen: 1
     gefiltert: 100,00
        Extra: NULL
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Derzeit wird der idx3-Index verwendet.

Dies ist das Ende dieses Artikels über die drei neuen Indizes in MySQL 8: versteckt, absteigend und Funktion. Weitere Informationen zu versteckten, absteigenden und Funktionsindizes in MySQL 8 finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Ausführliche Erläuterung versteckter Felder, einer neuen Funktion von MySQL 8.0
  • Absteigender Index in 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

<<:  Webdesign-Kenntnisse: Problem der adaptiven Höhe von Iframes

>>:  Mac+IDEA+Tomcat-Konfigurationsschritte

Artikel empfehlen

Docker löscht private Bibliotheksbilder vollständig

Werfen wir zunächst einen Blick auf die allgemein...

Vue.js implementiert eine einfache Timerfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Verwendung von Markierungs-Tags im CSS-Listenmodell

In diesem Artikel werden hauptsächlich die Stilat...

Detailliertes Beispiel für die JSON-Analyse mit MySQL (5.6 und darunter)

MySQL (5.6 und darunter) analysiert JSON #json-An...

Installieren Sie Percona Server+MySQL auf CentOS 7

1. Umgebungsbeschreibung (1) CentOS-7-x86_64, Ker...

Warum MySQL die Verwendung von Nullspalten mit Standardwerten nicht empfiehlt

Die Antwort, die Sie oft hören, ist, dass die Ver...

CSS verwendet calc(), um die aktuell sichtbare Bildschirmhöhe zu ermitteln

Schauen wir uns zunächst die relativen Längeneinh...

Zwei Implementierungen des Front-End-Routings von Vue-Router

Inhaltsverzeichnis Modusparameter HashHistorie Ha...

MySQL-Benutzer und -Berechtigungen und Beispiele zum Knacken des Root-Passworts

MySQL-Benutzer und -Berechtigungen In MySQL gibt ...