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

Verwenden Sie CSS, um einen kreisförmigen Welleneffekt zu erzielen

Auf Mobilgeräten sehe ich häufig kreisförmige Wel...

Javascript-Betriebsmechanismus „Event Loop“

Inhaltsverzeichnis 1. Vier Konzepte 1. JavaScript...

Vollständige Analyse der MySQL-Datentypen

Datentyp: Die grundlegenden Regeln, die definiere...

Detaillierte Schritte zum Ausführen eines Springboot-Projekts in Linux Docker

Einführung: Die Konfiguration von Docker, auf dem...

Freigabe der schnellen Wiederherstellungslösung für große MySQL-SQL-Dateien

Vorwort Bei der Verwendung einer MySQL-Datenbank ...

Installieren Sie MySQL 5.7 unter Ubuntu 18.04

Dieser Artikel wurde unter Bezugnahme auf die off...

Docker verwendet Dockerfile, um die Node.js-Anwendung zu starten

Schreiben einer Docker-Datei Am Beispiel des von ...

Docker+Gitlab+Jenkins erstellt automatisierte Bereitstellung von Grund auf

Inhaltsverzeichnis Vorwort: 1. Docker installiere...

Lösung für den Überlauf der HTML-Tabelle

Wenn die Tabelle breit ist, kann es zu einem Über...

26 häufig vergessene CSS-Tipps

Dies ist eine Sammlung häufig verwendeter, aber l...

Detaillierte Erklärung zum effizienten MySQL-Paging

Vorwort Normalerweise wird für MySQL-Abfragen mit...

Eintauchen in die JS-Vererbung

Inhaltsverzeichnis Vorwort Vorbereiten Zusammenfa...