MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Indizes in MySQL verstehen:Teil Zwei

Dieser Blogpost ist der zweite Teil der Blogreihe über Indizes in MySQL. Im ersten Teil der Blogpost-Reihe über MySQL-Indizes haben wir ziemlich viele Dinge behandelt, darunter was sie sind, was sie tun, was ihre Typen sind, wie man optimale Datentypen auswählt und MySQL-Zeichensätze für von Ihnen verwendete Indizes . Wir sind die Vor- und Nachteile der Verwendung von Indizes in MySQL durchgegangen; Wir haben Ihnen gesagt, wie Sie den besten zu verwendenden Index auswählen, die Abfrageleistung verbessern und sicherstellen, dass MySQL Ihre Indizes verwendet, wie viele Indizes Sie haben sollten. Wir haben auch einige Überlegungen zu Speicher-Engines angestellt. In diesem Blogbeitrag gehen wir näher auf einige der Inhalte ein, die wir im ersten Teil der Serie besprochen haben. Wir beginnen mit der Korrelation zwischen Indizes und Speicher-Engines in MySQL.

Indizes und Speicher-Engines in MySQL

Wie wir bereits in einem früheren Blogbeitrag erwähnt haben, kann es einige Beschränkungen für Indizes und andere Dinge geben, wenn Sie bestimmte Speicher-Engines in MySQL verwenden. Hier sind einige von ihnen – wir werden jetzt definieren, was einige davon sind (einige von ihnen wurden im ersten Teil der Blog-Serie behandelt, wenn wir also etwas vermissen, ist es wahrscheinlich dort), dann behandeln wir sie ausführlicher Analyse:

  • Gemäß der MySQL-Dokumentation ist die maximale Anzahl von Indizes, die maximale Schlüssellänge und die maximale Indexlänge pro Speicher-Engine definiert. Wie wir bereits in einem früheren Blogbeitrag erwähnt haben, beträgt die maximale Anzahl von Indizes pro MyISAM- und InnoDB-Tabellen 64, die maximale Anzahl von Spalten pro Index in beiden Speicher-Engines 16, die maximale Schlüssellänge für InnoDB 3500 Bytes und das Maximum Die Schlüssellänge für MyISAM beträgt 1000 Bytes.

  • Sie können CREATE INDEX nicht verwenden, um einen PRIMARY KEY zu erstellen - verwenden Sie stattdessen ALTER TABLE.

  • BLOB- und TEXT-Spalten können nur für Tabellen indiziert werden, auf denen die Speicher-Engines InnoDB, MyISAM und BLACKHOLE ausgeführt werden.

  • Wenn Sie nur ein Präfix der Spalte indizieren, denken Sie daran, dass die Präfixunterstützung und ihre Länge ebenfalls gelten abhängig von Speicher-Engines. Ein Präfix kann für InnoDB-Tabellen, die das Zeilenformat REDUNDANT oder COMPACT verwenden, bis zu 767 Byte lang sein, aber für die Zeilenformate DYNAMIC oder COMPRESSED wird die Begrenzung der Präfixlänge auf 3072 Byte erhöht. Für MyISAM-Tabellen beträgt die Begrenzung der Präfixlänge 1000 Byte. Die NDB-Speicher-Engine unterstützt überhaupt keine Präfixe.

  • Wenn ein strenger SQL-Modus aktiviert ist und das Indexpräfix die maximale Spaltendatentypgröße überschreitet, löst CREATE INDEX aus ein Fehler. Wenn kein strikter SQL-Modus aktiviert ist, erzeugt CREATE INDEX eine Warnung. Wenn ein UNIQUE INDEX erstellt wird, tritt ein Fehler auf.

  • Im Allgemeinen erlaubt Ihnen MySQL nur, bis zu 16 Indizes für eine gegebene Tabelle zu erstellen.

  • Wenn Sie einen PRIMARY KEY-Index verwenden, können Sie nur einen Primärschlüssel pro Tabelle haben. FULLTEXT, UNIQUE INDEXes und INDEXes haben diese Einschränkung nicht.

  •  Wenn Sie FULLTEXT-Indizes verwenden, denken Sie daran, dass sie nur für InnoDB- oder MyISAM-Speicher-Engines verwendet werden können und für CHAR-, VARCHAR- oder TEXT-Spalten. Denken Sie auch daran, dass MySQL FULLTEXT-Indizes nur verwendet, wenn MATCH() AGAINST()-Klauseln verwendet werden, und dass Sie tatsächlich gleichzeitig einen Index und einen Volltextindex für dieselbe Spalte haben können, wenn Sie dies wünschen, und dass FULLTEXT-Indizes ihre haben eigenen Satz von Stoppwörtern, die jeweils spezifisch für die verwendeten Speicher-Engines sind.

  • B-Tree-Indizes können nützlich sein, wenn Sie LIKE-Abfragen verwenden, die mit einem Platzhalter beginnen, aber nur in bestimmten Fällen Szenarien.

Die Kenntnis dieser Indexbeschränkungen sollte sich als nützlich erweisen, wenn Sie versuchen zu verstehen, wie Indizes in MySQL funktionieren. Noch wichtiger ist es jedoch zu verstehen, dass Sie überprüfen müssen, ob Ihre Indizes tatsächlich von MySQL verwendet werden. Wir haben dies im ersten Teil dieser Serie kurz angesprochen („Wie wählt man den besten zu verwendenden Index aus?“), aber wir haben Ihnen nicht gesagt, wie Sie überprüfen können, ob Ihre Indizes tatsächlich von MySQL verwendet werden. Überprüfen Sie dazu ihre Verwendung mit EXPLAIN - wenn EXPLAIN zusammen mit einer erklärbaren Anweisung verwendet wird, zeigt MySQL Informationen vom Optimierer über den Ausführungsplan der Anweisung an.

Überlegungen zum PRIMÄRSCHLÜSSEL

Einige der grundlegenden Überlegungen in Bezug auf PRIMARY KEY-Indizes in MySQL umfassen die Tatsache, dass sie hauptsächlich verwendet werden, um Datensätze in einer Tabelle eindeutig zu identifizieren, und dass sie häufig mit AUTO_INCREMENTing-Werten verwendet werden, was bedeutet, dass sie sehr nützlich sein können, wenn Sie erstellen beispielsweise ID-Felder. PRIMARY KEY-Felder müssen eindeutige Werte enthalten und dürfen keine NULL-Werte enthalten.

Abgleich eines Spaltenpräfixes

Indizes können auch mit einem Spaltenpräfix übereinstimmen. Dieser Ansatz für Indizes kann nützlich sein, wenn Ihre Spalten Zeichenfolgenspalten sind und Sie glauben, dass das Hinzufügen eines Indexes für die gesamte Spalte möglicherweise viel Speicherplatz beanspruchen würde. Ihre Indizes können wie folgt mit einem Spaltenpräfix übereinstimmen:

ALTER TABLE demo_table ADD INDEX index_name(column_name(length));

Die obige Abfrage würde einen Index index_name zu einer Spalte namens column_name nur für ein definiertes Spaltenpräfix hinzufügen. Um eine gute Länge für die Indizierung auszuwählen, stellen Sie sicher, dass Ihre Verwendung des Präfixes die Eindeutigkeit der Werte in der Spalte maximiert:Ermitteln Sie die Anzahl der Zeilen in der Tabelle und werten Sie verschiedene Präfixlängen aus, bis Sie die gewünschte Eindeutigkeit der Zeilen erreichen.

FULLTEXT-Indizes in MySQL

FULLTEXT-Indizes in MySQL sind etwas ganz anderes. Sie haben viele Einschränkungen, die nur für sie selbst gelten (zum Beispiel hat InnoDB eine Stoppwortliste, die aus 36 Wörtern besteht, während die MyISAM-Stoppwortliste aus 143 Wörtern besteht), sie haben auch einzigartige Suchmodi. Einige von ihnen beinhalten einen natürlichen Sprachmodus (um einen solchen Suchmodus zu aktivieren, führen Sie eine VOLLTEXT-Suchanfrage ohne Modifikatoren aus), Sie können Ihre Suche auch erweitern (verwenden Sie dazu den Modifikator WITH QUERY EXPANSION - ein solcher Suchmodus führt die zweimal suchen, aber wenn die Suche zum zweiten Mal ausgeführt wird, enthält sie einige der relevantesten Datensätze aus der ersten Suche (häufig verwendet, wenn ein Benutzer implizite Kenntnisse über etwas hat), um mit booleschen Operatoren zu suchen, verwenden Sie den Modifikator IN BOOLEAN MODE. FULLTEXT-Indizes werden ebenfalls nur verwendet, wenn die Suchanfrage aus mindestens drei Zeichen für InnoDB und aus mindestens vier Zeichen für MyISAM besteht.

B-Tree-Indizes mit Wildcards verwenden

Indexe werden auch häufig verwendet, wenn Sie etwas Ähnliches wie Suchmaschinen erstellen. Dafür möchten Sie häufig nur nach einem Teil eines Werts suchen und die Ergebnisse zurückgeben – hier kommen Wildcards ins Spiel. Eine einfache Abfrage mit Wildcard verwendet eine LIKE-Abfrage und das %-Zeichen, um „irgendetwas“ nach dem Text zu bedeuten. Eine Abfrage wie diese würde beispielsweise nach Ergebnissen suchen, die mit dem Wort „Suche“ beginnen und etwas dahinter haben:

SELECT * FROM … WHERE demo_column LIKE ‘search%’;

Eine Abfrage wie diese würde nach Ergebnissen suchen, die mit irgendetwas beginnen, das Wort „Suchen“ enthalten und irgendetwas danach haben:

SELECT * FROM … WHERE demo_column LIKE ‘%search%’;

Aber hier ist ein Haken:Die obige Abfrage verwendet keinen Index. Wieso den? Weil es am Anfang einen Platzhalter hat und MySQL nicht herausfinden kann, womit die Spalte beginnen muss. Aus diesem Grund haben wir gesagt, dass Wildcard-Indizes ihren Platz haben, aber nur in bestimmten Szenarien – also solchen Szenarien, in denen Sie keinen Platzhalter am Anfang Ihrer Suchanfrage haben.

Verwenden von ClusterControl zum Überwachen der Leistung von Abfragen

Neben der Verwendung von EXPLAIN können Sie auch ClusterControl verwenden, um die Leistung Ihrer Abfragen zu überwachen:ClusterControl bietet eine Reihe erweiterter Überwachungs- und Berichtsfunktionen, mit denen Sie die Leistung Ihrer Datenbankinstanzen und Abfragen verfolgen können . Klicken Sie beispielsweise auf einen Cluster und Sie sehen eine Registerkarte „Query Monitor“. Klicken Sie darauf und ClusterControl lässt Sie den Status Ihrer Abfragen in Ihren Datenbankinstanzen beobachten:

In diesem Teil von ClusterControl können Sie eine Liste der langsamsten und langwierigsten Ausführen von Abfragen, während Sie diese auch filtern können. Wenn Sie beispielsweise wissen, dass Sie vor nicht allzu langer Zeit eine Abfrage ausgeführt haben, die aus @@log_bin bestand, können Sie einfach nach dem Begriff suchen und ClusterControl gibt eine Ergebnisliste zurück:

Wie Sie wahrscheinlich bemerkt haben, können Sie Abfragen auch nach von Ihnen verwendeten Hosts filtern oder nach Vorkommen können Sie sich auch dafür entscheiden, eine Reihe von Zeilen anzuzeigen, z. B. 20, 100 oder 200. ClusterControl teilt Ihnen auch mit, wann die Abfrage zuletzt gesehen wurde, wie lange ihre Gesamtausführungszeit war, wie viele Zeilen sie zurückgegeben hat, wie viele Zeilen wurden untersucht und so weiter. ClusterControl kann sich als hilfreich erweisen, wenn Sie beobachten möchten, wie Ihre Indizes tatsächlich von MySQL-, MariaDB-, MongoDB-, PostgreSQL- oder TimescaleDB-Instanzen verwendet werden.

Zusammenfassung

In diesem Blogbeitrag sind wir einige Einschränkungen und Vorteile in Bezug auf Indizes in MySQL durchgegangen und haben auch behandelt, wie ClusterControl Ihnen helfen kann, Ihre Datenbankleistungsziele zu erreichen. Wir werden auch einen dritten Teil über Indizes in MySQL haben, der noch tiefer in sie eintaucht, aber um das bisher Besprochene abzuschließen, denken Sie daran, dass Indizes in MySQL sicherlich ihren eigenen Platz haben - um das Beste aus ihnen zu machen, wissen Sie wie sie mit Speicher-Engines interagieren, ihre Vorteile und Einschränkungen, wie und wann bestimmte Arten von Indizes verwendet und mit Bedacht ausgewählt werden.