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

Über das durch die HTML-Kodierung verursachte verstümmelte Problem

Heute hat ein Student im dritten Studienjahr eine...

Detaillierte Erklärung der Kernkonzepte und der grundlegenden Verwendung von Vuex

Inhaltsverzeichnis einführen Start Installieren ①...

Lösung für „Spezialisierter Schlüssel war zu lang“ in MySQL

Inhaltsverzeichnis Lösung 1 Lösung 2 Beim Erstell...

Linux Cron geplante Ausführung von PHP-Code mit Parametern

1. Verwenden Sie zur Ausführung weiterhin ein PHP...

Detaillierte Erklärung der Verwendung von JSON.parse und JSON.stringify

Inhaltsverzeichnis JSON.parse JSON.parse-Syntax R...

Wie man die Idee von Vue nutzt, um einen Speicher zu kapseln

Inhaltsverzeichnis Hintergrund Funktion Zweck Ide...

Reagieren Sie auf die Verarbeitung von Fehlergrenzkomponenten

Dies ist der Inhalt von React 16. Es ist nicht di...

So verwenden Sie das Vue-Router-Routing

Inhaltsverzeichnis 1. Beschreibung 2. Installatio...

Sechs wichtige Selektoren in CSS (merken Sie sie sich in drei Sekunden)

Von: https://blog.csdn.net/qq_44761243/article/de...