Detaillierte Erklärung unsichtbarer Indizes in MySQL 8.0

Detaillierte Erklärung unsichtbarer Indizes in MySQL 8.0

Wort

Seit der ersten Version von MySQL 8.0 liegen nun vier Jahre vergangen. In der Version 8.0 wurden wesentliche Verbesserungen und Umbauten in Bezug auf Funktionen und Code vorgenommen. Nach Rücksprache mit Freunden im DBA-Kreis verwenden die meisten von ihnen immer noch die Versionen 5.6 und 5.7, und eine kleine Anzahl von ihnen hat MySQL 8.0 übernommen. Um mit der Geschwindigkeit der Datenbankentwicklung Schritt zu halten und die Vorteile der Technologie so schnell wie möglich zu nutzen, planen wir, MySQL 8.0 in das Datenbanksystem von Youzan einzuführen.

Vor der Implementierung werden wir eine Reihe von Studien und Tests zu den neuen Features und Funktionen, Konfigurationsparametern, Upgrade-Methoden, Kompatibilität usw. von MySQL 8.0 durchführen. Weitere Artikel werden in Zukunft veröffentlicht. Dieser Artikel ist der erste, der die neuen Funktionen von MySQL 8.0 beschreibt. Lassen Sie uns über unsichtbare Indizes sprechen.

Unsichtbarer Index

Der unsichtbare Index bezieht sich auf den Optimierer. Bei der Analyse des Ausführungsplans (standardmäßig) ignoriert der Optimierer den Index mit dem gesetzten unsichtbaren Attribut.

Warum ist dies standardmäßig der Fall? Wenn optimizer_switch use_invisible_indexes=ON setzt, können Sie weiterhin unsichtbare Indizes verwenden.

Lassen Sie uns ohne weitere Umschweife ein paar Beispiele testen

So legen Sie einen unsichtbaren Index fest

Wir können die Sichtbarkeit des Indexes mit „create table“, „create index“ und „alter table“ mit den Schlüsselwörtern VISIBLE|INVISIBLE festlegen.

mysql> Tabelle t1 erstellen (i int,
   > j int,
   > k Ganzzahl,
   > index i_idx (i) unsichtbar) engine=innodb;
Abfrage OK, 0 Zeilen betroffen (0,41 Sek.)

mysql> erstelle Index j_idx auf t1 (j) unsichtbar;
Abfrage OK, 0 Zeilen betroffen (0,19 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> Tabelle ändern t1 Index k_idx (k) hinzufügen unsichtbar;
Abfrage OK, 0 Zeilen betroffen (0,10 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> wähle index_name,is_visible aus information_schema.statistics, wobei table_schema='test' und table_name='t1';
+------------+------------+
| INDEX_NAME | IST_SICHTBAR |
+------------+------------+
| i_idx | NEIN |
| j_idx | NEIN |
| k_idx | NEIN |
+------------+------------+
3 Zeilen im Satz (0,01 Sek.)

mysql> Tabelle t1 ändern, Index i_idx sichtbar ändern;
Abfrage OK, 0 Zeilen betroffen (0,06 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> wähle index_name,is_visible aus information_schema.statistics, wobei table_schema='test' und table_name='t1';
+------------+------------+
| INDEX_NAME | IST_SICHTBAR |
+------------+------------+
| i_idx | JA |
| j_idx | NEIN |
| k_idx | NEIN |
+------------+------------+
3 Zeilen im Satz (0,00 Sek.)

Die Rolle unsichtbarer Indizes

Angesichts einer großen Anzahl historischer Indizes trauen sich DBAs nach mehreren Entwicklungsrunden und dem Austausch alter und neuer Entwickler wahrscheinlich nicht, die Indizes direkt zu löschen, insbesondere wenn sie auf große Tabellen mit mehr als 100 G stoßen. Das direkte Löschen des Index erhöht das Risiko der Datenbankstabilität.

Mit der Funktion „Unsichtbarer Index“ kann der DBA den Index unsichtbar machen und gleichzeitig die langsamen Abfragedatensätze und den Thread-Ausführungsstatus der Datenbank beobachten. Wenn die Datenbank über einen längeren Zeitraum keine entsprechenden langsamen Abfragen aufweist und thread_running relativ stabil ist, kann der Index offline genommen werden. Andernfalls können Sie den Index schnell sichtbar machen und den Geschäftszugriff wiederherstellen.

Unsichtbare Indizes sind eine Funktion auf Serverebene und haben nichts mit der Engine zu tun, sodass sie von allen Engines (InnoDB, TokuDB, MyISAM usw.) verwendet werden können.

Nach dem Festlegen des unsichtbaren Index kann der Ausführungsplan den Index nicht mehr verwenden

mysql> anzeigen, Tabelle erstellen t2 \G
*************************** 1. Reihe ***************************
    Tabelle: t2
Tabelle erstellen: CREATE TABLE `t2` (
 `i` int NICHT NULL AUTO_INCREMENT,
 `j` int NICHT NULL,
 PRIMÄRSCHLÜSSEL (`i`),
 EINZIGARTIGER SCHLÜSSEL `j_idx` (`j`) /*!80000 UNSICHTBAR */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 Zeile im Satz (0,01 Sek.)
mysql> einfügen in t2(j) Werte(1),(2),(3),(4),(5),(6),(7);
Abfrage OK, 7 Zeilen betroffen (0,04 Sek.)
Datensätze: 7 Duplikate: 0 Warnungen: 0


mysql> erklären select * from t2 where j=3\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t2
  Partitionen: NULL
     Typ: ALLE
mögliche Schlüssel: NULL
     Schlüssel: NULL
   key_len: NULL
     Ref: NULL
     Reihen: 7
   gefiltert: 14,29
    Extra: Verwenden von „where“
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

mysql> Tabelle t2 ändern, Index j_idx sichtbar ändern;
Abfrage OK, 0 Zeilen betroffen (0,08 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> erklären select * from t2 where j=3\G
*************************** 1. Reihe ***************************
      ID: 1
 select_type: EINFACH
    Tabelle: t2
  Partitionen: NULL
     Typ: const
mögliche Schlüssel: j_idx
     Schlüssel: j_idx
   Schlüssellänge: 4
     Verweis: const
     Reihen: 1
   gefiltert: 100,00
    Extra: Index verwenden
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

Hinweise zur Verwendung unsichtbarer Indizes

Die Funktion gilt für andere Indizes als Primärschlüssel (entweder explizit oder implizit).

Unsichtbare Indizes sind für Nicht-Primärschlüsselindizes. Der Primärschlüssel kann nicht auf unsichtbar gesetzt werden. Der Primärschlüssel umfasst hier explizite Primärschlüssel oder implizite Primärschlüssel (wenn kein Primärschlüssel vorhanden ist, wird er zum eindeutigen Index des Primärschlüssels hochgestuft). Wir können das folgende Beispiel verwenden, um diese Regel zu veranschaulichen.

mysql> Tabelle t2 erstellen (
   >i int nicht null,
   >j int nicht null,
   >eindeutiges j_idx (j)
   >) ENGINE = InnoDB;
Abfrage OK, 0 Zeilen betroffen (0,16 Sek.)

mysql> wähle index_name,is_visible aus information_schema.statistics, wobei table_schema='test' und table_name='t2';
+------------+------------+
| INDEX_NAME | IST_SICHTBAR |
+------------+------------+
| j_idx | JA |
+------------+------------+
1 Zeile im Satz (0,00 Sek.)

### Wenn kein Primärschlüssel vorhanden ist, wird der eindeutige Schlüssel als impliziter Primärschlüssel behandelt und kann nicht auf unsichtbar gesetzt werden.
mysql> Tabelle t2 ändern, Index j_idx unsichtbar ändern;
FEHLER 3522 (HY000): Ein Primärschlüsselindex kann nicht unsichtbar sein
MySQL>
mysql> Tabelle ändern t2 Primärschlüssel hinzufügen (i);
Abfrage OK, 0 Zeilen betroffen (0,44 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> wähle index_name,is_visible aus information_schema.statistics, wobei table_schema='test' und table_name='t2';
+------------+------------+
| INDEX_NAME | IST_SICHTBAR |
+------------+------------+
| j_idx | JA |
| GRUNDSCHULE | JA |
+------------+------------+
2 Zeilen im Satz (0,01 Sek.)

mysql> Tabelle t2 ändern, Index j_idx unsichtbar ändern;
Abfrage OK, 0 Zeilen betroffen (0,04 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

mysql> wähle index_name,is_visible aus information_schema.statistics, wobei table_schema='test' und table_name='t2';
+------------+------------+
| INDEX_NAME | IST_SICHTBAR |
+------------+------------+
| j_idx | NEIN |
| GRUNDSCHULE | JA |
+------------+------------+
2 Zeilen im Satz (0,01 Sek.)

force /ignore index(index_name) Auf unsichtbare Indizes kann nicht zugegriffen werden, andernfalls wird ein Fehler gemeldet.

mysql> wähle * von t2 aus, erzwinge Index(j_idx), wobei j=3;
FEHLER 1176 (42000): Schlüssel „j_idx“ existiert nicht in Tabelle „t2“

Um einen Index unsichtbar zu machen, ist eine MDL-Sperre erforderlich, die bei langen Transaktionen zu Datenbank-Jitter führen kann.

Der eindeutige Index ist auf unsichtbar eingestellt, was nicht bedeutet, dass die Eindeutigkeitsbeschränkung des Index selbst ungültig ist.

mysql> wähle * aus t2;
+---+----+
| ich | j |
+---+----+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 11 |
+---+----+
8 Zeilen im Satz (0,00 Sek.)
mysql> in t2(j) Werte einfügen(11);
FEHLER 1062 (23000): Doppelter Eintrag „11“ für Schlüssel „t2.j_idx“

Zusammenfassung

Eigentlich gibt es nicht viel zu sagen, ich wünsche Ihnen allen eine angenehme Nutzung.

-Das Ende-

Oben finden Sie eine ausführliche Erläuterung des unsichtbaren Index in MySQL 8.0. Weitere Informationen zum unsichtbaren Index in MySQL 8.0 finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Was ist schneller: MySQL-Volltextindex, gemeinsamer Index, Like-Abfrage und JSON-Abfrage?
  • MySQL-Volltextindex, um eine einfache Version des Suchmaschinen-Beispielcodes zu erreichen
  • MySQL ermöglicht die gemeinsame Nutzung von Volltextindizes
  • Ein kurzes Tutorial zur MySQL-Volltextindexanwendung
  • Vertieftes Verständnis basierend auf dem MySQL-Volltextindex
  • Detaillierte Analyse mehrerer Situationen, in denen MySQL-Indizes fehlschlagen
  • Detaillierte Analyse der Auswahl des MySQL-Gemeinschaftsindex und des eindeutigen Index
  • Kurze Analyse des MySQL B-Tree-Index
  • Absteigender Index in MySQL 8.0
  • Index-Skip-Scan in MySQL 8.0
  • Zusammenfassung häufiger Probleme mit MySQL-Indizes
  • MySql-Index verbessert die Abfragegeschwindigkeit allgemeine Methoden Codebeispiele
  • Die Prinzipien und Mängel der MySQL-Volltextindizierung

<<:  So stellen Sie ein Vue-Projekt mit Docker-Image + nginx bereit

>>:  Detaillierte Erklärung zu React Hooks

Artikel empfehlen

Detaillierte Erklärung der Angular-Komponentenprojektion

Inhaltsverzeichnis Überblick 1. Einfaches Beispie...

Zwei Möglichkeiten zur Verwendung von React in React HTML

Grundlegende Verwendung <!DOCTYPE html> <...

Detaillierte Erklärung des in JavaScript integrierten Date-Objekts

Inhaltsverzeichnis Date-Objekt Erstellen eines Da...

So richten Sie Referer in Nginx ein, um Bilddiebstahl zu verhindern

Wenn die Bilder des Servers von anderen Websites ...

Vue echarts realisiert die dynamische Anzeige von Balkendiagrammen

In diesem Artikel wird der spezifische Code von V...

Detaillierte Erklärung, wo das von Docker abgerufene Image gespeichert ist

20200804Nachtrag: Der Artikel könnte falsch sein....

js Canvas realisiert zufällige Partikeleffekte

In diesem Artikelbeispiel wird der spezifische Co...