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

JS-Prinzip der asynchronen Ausführung und Rückrufdetails

1. JS-Prinzip der asynchronen Ausführung Wir wiss...

4 praktische Tipps für die Webseitengestaltung

Verwandte Artikel: 9 praktische Tipps zum Erstelle...

So passen Sie die Protokollebene von Nginx in Docker an

Inhaltsverzeichnis Einleitung Nginx-Dockerdatei N...

MySQL stellt Daten über Binlog wieder her

Inhaltsverzeichnis MySQL-Protokolldateien binlog ...

Die MySQL-Partitionstabelle ist nach Monaten klassifiziert

Inhaltsverzeichnis Erstellen einer Tabelle Zeigen...

MySQL 8.x MSI-Version Installations-Tutorial mit Bildern und Text

1. MySQL herunterladen Offizielle Website-Downloa...

Detaillierte Erklärung der Semiotik in Html/CSS

Basierend auf Theorien wie Saussures Sprachphilos...

So konfigurieren Sie Http, Https, WS und WSS in Nginx

Vorne geschrieben Im heutigen Internetbereich ist...

Font Treasure House 50 exquisite kostenlose englische Schriftartenressourcen Teil 2

Designer verfügen über eine eigene Schriftartenbi...

Mehrere allgemeine Beispielcodes für Weiterleitungsverbindungen in HTML

Code kopieren Der Code lautet wie folgt: window.l...

Nginx: Ein Domänenname für den Zugriff auf mehrere Projekte – Methodenbeispiel

Hintergrund Kürzlich stieß ich bei der Bereitstel...