Neue Features in MySQL 8: Unsichtbare Indizes

Neue Features in MySQL 8: Unsichtbare Indizes

Hintergrund

Indizes sind ein zweischneidiges Schwert. Sie erhöhen zwar die Abfragegeschwindigkeit, verlangsamen aber auch DML-Operationen. Schließlich verursacht die Indexpflege gewisse Kosten. Fügen Sie daher für den Index hinzu, was hinzugefügt werden soll, und löschen Sie das Unnötige. Ersteres ist Addition und Letzteres ist Subtraktion. Doch in der tatsächlichen Arbeit scheint jeder eher Ersteres zu bevorzugen und Letzteres nur selten zu tun. Der Grund liegt im Letzteren, was schwierig ist. Die Schwierigkeit liegt nicht in der Operation selbst, sondern darin, festzustellen, ob ein Index unbrauchbar ist.

So identifizieren Sie nutzlose Indizes

Bevor es unsichtbare Indizes gab, konnten Sie sys.schema_unused_indexes verwenden, um nicht verwendete Indizes zu identifizieren. In MySQL 5.6 können Sie auch ohne die Sys-Bibliothek Abfragen über die Basistabelle der Ansicht durchführen.

mysql> anzeigen, erstellen, Tabelle sys.schema_unused_indexes\G
*************************** 1. Reihe ***************************
        Ansicht: schema_unused_indexes
    Ansicht erstellen: CREATE ALGORITHM=MERGE DEFINER=`mysql.sys`@`localhost` SQL SECURITY INVOKER VIEW `sys`.`schema_unused_indexes` (
`object_schema`,` object_name`, `index_name`) as select` t`.`Object_schema` as `object_schema`,` t`.`Object_name` as `object_name`,` t'Index_name `Index_name `t` Join` Information_schema`.`statistics` `s` on f8) = `s`.`index_name`)) wob .`seq_in_index` = 1)) Order by `t`.`object_schema`,` t`.`object_name`character_set_client: utf8mb4
Sortierverbindung: utf8mb4_0900_ai_ci
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Doch dieser Ansatz hat auch Nachteile.

1. Wenn die Instanz neu gestartet wird, werden die Daten im Performance-Schema gelöscht.

2. Was passiert, wenn der Index basierend auf der obigen Abfrage gelöscht wird und die Abfrageleistung plötzlich nachlässt?

Das Aufkommen unsichtbarer Indizes kann die oben genannten Mängel wirksam ausgleichen. Wenn Sie den Index auf unsichtbar setzen, ignoriert der Optimierer den Index bei der Auswahl eines Ausführungsplans automatisch, selbst wenn FORCE INDEX verwendet wird.

Dies wird natürlich durch die Option use_invisible_indexes in der Variable optimizer_switch bestimmt, die standardmäßig deaktiviert ist. Wenn Sie den Unterschied im Ausführungsplan einer Abfrage vor und nach der Indexanpassung sehen möchten, können Sie den Wert von use_invisible_indexes auf Sitzungsebene anpassen, beispielsweise:

mysql> anzeigen, Tabelle erstellen slowtech.t1\G
*************************** 1. Reihe ***************************
   Tabelle: t1
Tabelle erstellen: CREATE TABLE `t1` (
 `id` int(11) NICHT NULL,
 `name` varchar(10) DEFAULT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_name` (`name`) /*!80000 UNSICHTBAR */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 Zeile im Satz (0,00 Sek.)
mysql> erläutern Sie „select * from slowtech.t1“, wobei Name='a';
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 6 | 16,67 | Verwenden von where |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)
mysql> setze Sitzung optimizer_switch="use_invisible_indexes=on";
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> erläutern Sie „select * from slowtech.t1“, wobei Name='a';
+----+----------+-------+------------+------+---------------+-----------+----------+----------+---------+----------+----------+----------+-------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+-------+------------+------+---------------+-----------+----------+----------+---------+----------+----------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | ref | idx_name | idx_name | 43 | const | 1 | 100.00 | Index wird verwendet |
+----+----------+-------+------------+------+---------------+-----------+----------+----------+---------+----------+----------+----------+-------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Allgemeine Operationen an unsichtbaren Indizes

Erstellen Sie Tabelle t1 (ID int Primärschlüssel, Name varchar (10), Index idx_name (Name) unsichtbar);
Tabelle t1 ändern, Index idx_name sichtbar ändern;
Tabelle t1 ändern, Index idx_name unsichtbar ändern;

So sehen Sie, welche Indizes unsichtbar sind

mysql> wähle table_schema,table_name,index_name,column_name,is_visible aus information_schema.statistics, wobei is_visible='no';
+--------------+------------+------------+-------------+------------+
| TABELLE_SCHEMA | TABELLENNAME | INDEX_NAME | SPALTENNAME | SICHTBAR |
+--------------+------------+------------+-------------+------------+
| slowtech | t1 | idx_name | Name | NEIN |
+--------------+------------+------------+-------------+------------+
1 Zeile im Satz (0,00 Sek.)

Beachten

1. Der Primärschlüsselindex kann nicht auf unsichtbar gesetzt werden.

Zusammenfassen

Oben ist die neue Funktion von MySQL 8, unsichtbare Indizes, die ich Ihnen vorgestellt habe. Ich hoffe, sie wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten!

Das könnte Sie auch interessieren:
  • Neue Funktionen in MySQL 8.0: Unterstützung für atomare DDL-Anweisungen
  • Detaillierte Erläuterung der zugrunde liegenden Implementierung des absteigenden Index, einer neuen Funktion von MySQL 8
  • Neue Funktionen in MySQL 8.0: Hash Join
  • Eine kurze Diskussion über die Fallstricke und Lösungen der neuen Features von MySQL 8.0 (Zusammenfassung)
  • Neue Funktionen in MySQL 8: Details zu absteigenden Indizes
  • Neue Funktionen von MySQL 8: So ändern Sie persistente globale Variablen
  • Neue Funktionen von MySQL 8: Detaillierte Erklärung der Persistenz des automatisch inkrementierten Primärschlüssels
  • Analyse der neuen Funktionen von MySQL 8.0 - Transaktionales Datenwörterbuch und Atomic DDL

<<:  Eine kurze Einführung in Linux-Leistungsüberwachungsbefehle kostenlos

>>:  Detaillierte Erläuterung der Linux-Dateiberechtigungen und Befehle zur Gruppenänderung

Artikel empfehlen

Detaillierte Erläuterung der primitiven Werte und Referenzwerte in ECMAScript

Inhaltsverzeichnis Vorwort Was sind dynamische Ei...

Tabellen in HTML aufteilen und zusammenführen (colspan, rowspan)

Der Code demonstriert die horizontale Zusammenfüh...

Einführung in die Funktionen und Verwendung von Wert- und Namensattributen in HTML

1. Der in der Schaltfläche verwendete Wert bezieht...

Mysql speichert Baumstruktur durch Adjazenzliste (Adjazenzliste)

Der folgende Inhalt stellt den Prozess und die Lö...

Beispielanalyse der Verwendung gespeicherter MySQL-Prozeduren

Dieser Artikel beschreibt die Verwendung gespeich...

Vue-Praxis zur Vermeidung mehrfacher Klicks

Im Allgemeinen werden Klickereignisse in verschie...

MySQL 5.7.20 Green Edition Installation Detailliertes grafisches Tutorial

Lassen Sie uns zunächst verstehen, was MySQL ist....

Beispielcode zum Ändern des Textstils der Eingabeaufforderung in HTML

Auf vielen Websites wird im Eingabefeld Hinweiste...

Teilen Sie die 15 besten HTML/CSS-Design- und Entwicklungsframeworks

Professionelles Webdesign ist komplex und zeitint...

Detaillierte Erläuterung des Nginx-Forward-Proxys und des Reverse-Proxys

Inhaltsverzeichnis Weiterleitungsproxy Nginx-Reve...

So geben Sie chinesische Zeichen im Linux-Kernel aus

Sie können problemlos Chinesisch eingeben und im ...

JavaScript-Tippspiel

In diesem Artikel wird der spezifische JavaScript...