Versteckte, absteigende und funktionale Indizes in MySQL 81. Versteckter Index1. Übersicht über versteckte Indizes
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. 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. 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“. 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. 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 Index1. Übersicht über den absteigenden Index
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. 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
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:
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. 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:
|
<<: Webdesign-Kenntnisse: Problem der adaptiven Höhe von Iframes
>>: Mac+IDEA+Tomcat-Konfigurationsschritte
Bei der Optimierung der Datenbankleistung wird im...
Textkürzung mit CSS Beachten Sie den folgenden Co...
Werfen wir zunächst einen Blick auf die allgemein...
In diesem Artikelbeispiel wird der spezifische Co...
In diesem Artikel werden hauptsächlich die Stilat...
MySQL (5.6 und darunter) analysiert JSON #json-An...
1. Umgebungsbeschreibung (1) CentOS-7-x86_64, Ker...
Nachdem Sie VMware installiert und eine neue virt...
In diesem Artikelbeispiel wird der spezifische Co...
Die Antwort, die Sie oft hören, ist, dass die Ver...
Schauen wir uns zunächst die relativen Längeneinh...
1. Aufgetretene Probleme Bei der verteilten Proje...
Inhaltsverzeichnis Modusparameter HashHistorie Ha...
MySQL-Benutzer und -Berechtigungen In MySQL gibt ...
1. Warm und sanft Zugehörige Adresse: http://www.w...