Ein allgemeiner Vorschlag besteht darin, Indizes für WHERE-Bedingungen zu erstellen, was jedoch eigentlich einseitig ist. Indizes sollten für alle Abfragen entworfen werden, nicht nur für die WHERE-Bedingungen. Indizes helfen zwar dabei, Datenzeilen effizient zu finden, MySQL kann jedoch auch Indizes verwenden, um Spaltendaten abzurufen, ohne überhaupt eine Datenzeile lesen zu müssen. Schließlich enthalten die Blattknoten eines Index den Wert, der dem Index entspricht. Warum die Zeilen lesen, wenn Sie einfach den Index lesen können, um die gewünschten Daten zu erhalten? Wenn ein Index alle Daten für eine Abfrage enthält, wird er als überdeckender Index bezeichnet. Das Abdecken von Indizes kann ein sehr mächtiges Werkzeug sein und die Leistung deutlich verbessern. Stellen Sie sich den Fall vor, dass Sie die Daten nicht lesen müssen, sondern nur den Index:
In allen Fällen ist der Aufwand für eine Abfrage, die nur indizierte Spalten umfasst, wesentlich geringer als für die Suche in den Datenzeilen. Es ist wichtig zu beachten, dass ein gruppierter Index nicht einfach nur ein beliebiger Indextyp ist. Ein gruppierter Index muss die Werte speichern, die den indizierten Datenspalten entsprechen. Hash-, räumliche und Volltextindizes speichern diese Werte nicht, daher kann MySQL zur Abdeckung der Abfrage nur Binärbäume verwenden. Darüber hinaus implementieren verschiedene Speicher-Engines abdeckende Indizes auf unterschiedliche Weise, und nicht alle Speicher-Engines unterstützen abdeckende Indizes (die Memory-Speicher-Engine unterstützt dies beispielsweise derzeit nicht). Wenn Sie überprüfen, ob der Index in der Abfrage einen überdeckenden Index verwendet, wird bei Verwendung der Explain-Anweisung in der Spalte „Extra“ „Index wird verwendet“ angezeigt. Beispielsweise gibt es einen mehrspaltigen Index für die Tabelle „store_goods“: (shop_id, goods_category_id1). MySQL kann den Index verwenden, wenn die Abfrage nur Daten für diese beiden Spalten zurückgibt: EXPLAIN SELECT `goods_category_id1`,`shop_id` FROM `store_goods` WHERE 1 Das Abdecken von Indexabfragen kann solche Optimierungen in manchen Fällen ungültig machen. Der MySQL-Abfrageoptimierer ermittelt beim Ausführen der Abfrage, ob der Index die Abfrage abdeckt. Angenommen, der Index deckt die WHERE-Bedingung ab, aber nicht die gesamte Abfrage. Wenn die Auswertung dazu führt, dass kein überdeckender Index verwendet werden soll, werden die Datenzeilen in MySQL 5.5 und früheren Versionen direkt abgerufen, auch wenn die Daten nicht benötigt werden, und anschließend herausgefiltert. Sehen wir uns an, warum dies passiert und wie die Abfrage umgeschrieben werden kann, um das Problem zu beheben. Zunächst lautet die Abfrage: EXPLAIN SELECT * FROM Produkte WHERE Schauspieler='SEAN CARREY' AND Titel wie '%APOLLO%' Das Ergebnis ist, dass zu diesem Zeitpunkt nicht der überdeckende Index, sondern der normale Index verwendet wird, weil:
Dies lässt sich durch die geschickte Kombination von Indizes und das Umschreiben der Abfrage erreichen. Wir können den Index auf (Künstler, Titel, Produkt-ID) erweitern und die Abfrage wie folgt umschreiben: ERKLÄREN AUSWÄHLEN * FROM Produkte VERBINDEN ( Wählen Sie Produkt-ID aus FROM Produkte WO Schauspieler='SEAN CARREY' UND TITEL WIE '%APOLLO%' ) ALS t1 EIN (t1.prod_id=products.prod_id) Wir nennen dies einen „verzögerten Join“, da dadurch der Zugriff auf die Spalten verzögert wird. In der ersten Phase der Abfrage verwendet MySQL den überdeckenden Index, wenn es übereinstimmende Zeilen in der Unterabfrage findet. Obwohl es nicht in der gesamten Abfrage abgedeckt ist, ist es besser als nichts. Die Wirksamkeit dieser Optimierung hängt davon ab, wie viele Datenzeilen in der WHERE-Bedingung gefunden werden. Nehmen Sie an, dass die Produkttabelle Millionen von Datenzeilen enthält. Sie können die Leistung dieser beiden Abfragen mit insgesamt 1 Million Datenzeilen vergleichen.
Die Vergleichsergebnisse sind in der folgenden Tabelle dargestellt.
Die Ergebnisse werden wie folgt erläutert:
In den meisten Speicher-Engines kann ein Index nur den Zugriff auf Spalten abdecken, die Teil des Indexes sind. Tatsächlich nimmt InnoDB jedoch noch eine weitere Optimierung vor. Denken Sie an die sekundären Indizes von InnoDB, die die Primärschlüsselwerte in den Blattknoten speichern. Dies bedeutet, dass die sekundären Indizes von InnoDB tatsächlich über zusätzliche Spalten verfügen, die InnoDB bei der Verwendung von abdeckenden Indizes helfen. Beispielsweise verwendet die Tabelle sakila.actor InnoDB und verfügt über einen Index für last_name, sodass dieser Index Abfragen basierend auf dem Primärschlüssel actor_id abdecken kann – auch wenn diese Spalte nicht Teil des Indexes ist. EXPLAIN SELECT Schauspieler-ID, Nachname VON sakila.actor WO Nachname = 'HOPPER' Oben finden Sie ausführliche Informationen zu den Vorteilen des MySQL-Überdeckungsindex. Weitere Informationen zum MySQL-Überdeckungsindex finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
>>: So verwenden Sie border-image, um Beispielcode für Textblasenränder zu implementieren
Dieser Artikel beschreibt anhand eines Beispiels ...
Inhaltsverzeichnis Vue3-Kapselungsnachrichten-Ein...
Wenn Sie Bash beenden möchten, haben Sie zwei Mög...
Öffentliche kostenlose STUN-Server Wenn das SIP-T...
Inhaltsverzeichnis 1. Installieren Sie zuerst ech...
Bei der Verwendung von Docker-Images können Image...
Ich habe es im MSI-Format installiert, hauptsächl...
In diesem Artikel wird der spezifische Code von j...
Inhaltsverzeichnis Vorwort Was ist Index-Pushdown...
Inhaltsverzeichnis 1. Einführung in den Implement...
Die Echtzeitreplikation ist die wichtigste Method...
Die Projektanforderungen lauten: Datum und Uhrzei...
Inhaltsverzeichnis Einführung Installieren Anzeig...
Vor einiger Zeit hat der Blogger das Ubuntu-Syste...
Es gibt zwei Möglichkeiten, CSV in Win10 zu expor...