Beispielanalyse der MySQL-Indexabdeckung

Beispielanalyse der MySQL-Indexabdeckung

Dieser Artikel beschreibt die MySQL-Indexabdeckung anhand von Beispielen. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Indexabdeckung

Wenn die abgefragte Spalte zufällig Teil des Indexes ist, muss die Abfrage nur für die Indexdatei ausgeführt werden und es ist nicht erforderlich, zur Suche nach den Daten auf der Festplatte zurückzukehren. Diese Art der Abfrage ist sehr schnell und wird als „Index-Covering“ bezeichnet.

Angenommen, es gibt eine t15-Tabelle, in der ein gemeinsamer Index erstellt wird: cp (cat_id, price)

這里寫圖片描述

Wenn wir die folgende SQL-Anweisung verwenden, erfolgt eine Indexabdeckung. Wenn Sie das nicht glauben, können wir es uns ansehen. Das Extra hier zeigt Using index, was bedeutet, dass diese SQL-Anweisung nur Indexabdeckung verwendet.

這里寫圖片描述

Wählen Sie den Preis aus t15, wobei cat_id = 1 ist;

Sehen wir uns eine Frage an. Erstellen Sie eine T11-Tabelle mit einem Index für die E-Mail-Spalte.

這里寫圖片描述

Angenommen, wir verwenden die folgende Abfrage:

Wählen Sie die E-Mail aus T11, wobei right(email,4)='.com' ist.

Abfrageanalyse:

這里寫圖片描述

Schauen wir uns zunächst Extra an. Hier steht Using index, was bedeutet, dass hier Indexabdeckung verwendet wird. Der Grund, warum possible_keys NULL ist, liegt darin, dass die Funktion in MySQL verwendet wird, sodass der E-Mail-Index während der Abfrage nicht verwendet wird, aber der Schlüssel ist email, was bedeutet, dass der Index zum Sortieren verwendet wird. Wenn Sie mir nicht glauben, drucke ich die Daten aus und schaue nach.

這里寫圖片描述

Die Daten hier sind sortiert. Die Originaldaten sehen so aus.

這里寫圖片描述

Indexabdeckungsproblem

Erstellen Sie Tabelle A (
id varchar(64) Primärschlüssel,
ver int,
…
)

Die Tabelle enthält mehrere sehr lange Felder varbinary(3000) mit gemeinsamen Indizes für id und ver, insgesamt 10.000 Datensätze

Warum ist select id from A order by id so langsam?
Und select id from A order by id,ver ist sehr schnell

Frage: id und (id,ver) haben beide Indizes, und select id sollte den Effekt der „Indexabdeckung“ erzeugen. Warum ist ersteres langsam und letzteres schnell?

Idee: Der Unterschied zwischen InnoDB-Clusterindex und MyISAM-Index. Betrachten Sie die Indexabdeckung aus diesen beiden Perspektiven

(1) Unter der Annahme, dass diese Tabelle einen MyISAM-Index verwendet, muss keine der beiden SQL-Anweisungen eine Zeile zurückgehen, um nach Daten zu suchen. Ihre Geschwindigkeiten sollten also ähnlich sein.

(2) Angenommen, diese Tabelle verwendet den InnoDB-Index, dann verwendet die SQL-Anweisung „select id from A order by id“ den Primärschlüsselindex. Dies liegt daran, dass jeder Primärschlüssel von InnoDB die Daten jeder Zeile enthält und es in dieser Abfrage mehrere besonders große Felder gibt, sodass die Suche nach der ID relativ langsam ist. Die SQL-Anweisung „select id from A order by id,ver“ verwendet den gemeinsamen Index „id,ver“. In der InnoDB-Speicher-Engine speichert der Sekundärindex die Anwendung des Primärschlüsselindex, sodass der Sekundärindex nicht die Daten der Zeile enthält. In diesem Fall ist die Suche nach der ID im Index (id,ver) schneller. Wenn der entsprechende Knotenbaum gefunden wurde, muss nur erneut nach der Position des Primärschlüsselindex gesucht werden, um die Daten der Zeile zu erhalten. Das ist schneller.

schließen:

(1) Wenn die Tabelle die MyISAM-Engine verwendet, gibt es keinen signifikanten Unterschied in der Geschwindigkeit zwischen den beiden Anweisungen.
(2) Aufgrund des Clustered-Index muss sich der ID-Index der InnoDB-Tabelle über mehrere Blöcke auf der Festplatte erstrecken, was zu einer langsamen Geschwindigkeit führt.
(3) Auch bei der InnoDB-Engine gibt es keinen signifikanten Unterschied in der Geschwindigkeit der beiden Anweisungen, wenn keine langen Varbinay-Spalten vorhanden sind.

Tabelle t12, Speicher-Engine MyISAM, hat Primärschlüsselindex und (id,ver)-Index sowie mehrere große Felder mit variabler Länge. Testinferenz 1

這里寫圖片描述

Tabelle t13 mit der Speicher-Engine InnoDB verfügt über einen Primärschlüsselindex und einen (id,ver)-Index sowie mehrere große Felder mit variabler Länge.

這里寫圖片描述

Tabelle t14, Speichermodul ist InnoDB, hat Primärschlüsselindex und (id,ver)-Index, keine großen Felder mit variabler Länge Folgerung 3

這里寫圖片描述

Jede Tabelle von t12, t13 und t14 enthält 10.000 Daten, und dann wird ein Test durchgeführt. Die Testergebnisse sind wie folgt und unsere Schlussfolgerung ist korrekt.

這里寫圖片描述

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „Zusammenfassung der Kenntnisse im Bereich MySQL-Indexoperationen“, „Zusammenfassung der Kenntnisse im Bereich MySQL-Allgemeinfunktionen“, „Zusammenfassung der Kenntnisse im Bereich MySQL-Protokolloperationen“, „Zusammenfassung der Kenntnisse im Bereich MySQL-Transaktionsoperationen“, „Zusammenfassung der Kenntnisse im Bereich MySQL-gespeicherte Prozeduren“ und „Zusammenfassung der Kenntnisse im Zusammenhang mit MySQL-Datenbanksperren“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • So verwenden Sie MySQL zur Abdeckung von Index- und Tabellenrückgabe
  • MySQL verwendet einen abdeckenden Index, um Tabellenrückgaben zu vermeiden und die Abfrage zu optimieren
  • Erklärung der Rückgabe einer MySQL-Tabelle führt zur Ungültigkeit des Index
  • Detaillierte Erläuterung der Tabellenrückgabe- und Indexabdeckungsbeispiele in MySQL

<<:  Detailliertes Installationstutorial für Zabbix 4.04 (basierend auf CentOS 7.6)

>>:  Das WeChat-Applet implementiert eine einfache Taschenrechnerfunktion

Artikel empfehlen

Eine eingehende Analyse von MySQL erläutert die Verwendung und die Ergebnisse

Vorwort Bei unserer täglichen Arbeit führen wir m...

Warum node.js nicht für große Projekte geeignet ist

Inhaltsverzeichnis Vorwort 1. Anwendungskomponent...

Eine kurze Analyse der MySQL-Kardinalitätsstatistiken

1. Was ist die Kardinalität? Mit Kardinalität wir...

So zeigen Sie Bildinformationen in Docker an

In diesem Artikel müssen wir lernen, wie man Bild...

So legen Sie MySQL-Fremdschlüssel für Anfänger fest

Inhaltsverzeichnis Die Rolle von Fremdschlüsseln ...

Implementierung von webpack-dev-server zum Erstellen eines lokalen Servers

Inhaltsverzeichnis Vorwort Webpack-Deb-Server Sta...

Instanzmethode für MySQL-String-Verkettung und Festlegen von Nullwerten

#String-Verkettung concat(s1,s2); verkette die St...

Eine benutzerfreundliche Alternative in Linux (Befehl fd)

Der Befehl fd bietet eine einfache und unkomplizi...

HTML+CSS zum Erreichen eines Surround-Reflexionsladeeffekts

In diesem Artikel wird hauptsächlich die Implemen...

Ein kurzes Verständnis der drei Prinzipien zum Hinzufügen von MySQL-Indizes

1. Die Bedeutung von Indizes Indizes werden verwe...

Detaillierter Prozess zum Erstellen von MongoDB und MySQL mit Docker-Compose

Schauen wir uns die detaillierte Methode zum Erst...

Gängige Master-Slave-Replikationsarchitekturen in MySQL 4

Inhaltsverzeichnis Replikationsarchitektur mit ei...

Verwendung von Linux-Netzwerkkonfigurationstools

Dieser Artikel stellt RHEL8-Netzwerkdienste und N...