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

Indizes in MySQL verstehen:Teil Drei

Dieser Blogbeitrag ist der dritte Teil der Blogreihe über Indizes in MySQL . Im zweiten Teil der Blogpost-Reihe über MySQL-Indizes haben wir Indizes und Speicher-Engines behandelt und einige PRIMARY KEY-Überlegungen angesprochen. Die Diskussion umfasste, wie ein Spaltenpräfix abgeglichen wird, einige Überlegungen zum FULLTEXT-Index und wie Sie B-Tree-Indizes mit Platzhaltern verwenden sollten und wie Sie ClusterControl verwenden, um die Leistung Ihrer Abfragen zu überwachen, und anschließend Indizes.

 

In diesem Blogbeitrag gehen wir näher auf Indexe in MySQL ein :Wir werden Hash-Indizes, Indexkardinalität, Indexselektivität behandeln, wir werden Ihnen interessante Details über das Abdecken von Indizes erzählen und wir werden auch einige Indexierungsstrategien durchgehen. Und natürlich werden wir auf ClusterControl eingehen. Fangen wir an, sollen wir?

Hash-Indizes in MySQL

MySQL-DBAs und -Entwickler, die sich mit MySQL befassen, haben noch einen weiteren Trick im Ärmel, was MySQL betrifft - Hash-Indizes sind ebenfalls eine Option. Hash-Indizes werden häufig in der MEMORY-Engine von MySQL verwendet – wie so ziemlich alles in MySQL haben diese Arten von Indizes ihre eigenen Vor- und Nachteile. Der Hauptnachteil dieser Art von Indizes besteht darin, dass sie nur für Gleichheitsvergleiche verwendet werden, die die Operatoren =oder <=> verwenden, was bedeutet, dass sie nicht wirklich nützlich sind, wenn Sie nach einem Wertebereich suchen möchten, aber der Hauptvorteil ist dass Suchvorgänge sehr schnell sind. Ein paar weitere Nachteile sind die Tatsache, dass Entwickler kein ganz linkes Präfix des Schlüssels verwenden können, um Zeilen zu finden (wenn Sie das tun möchten, verwenden Sie stattdessen B-Tree-Indizes), die Tatsache, dass MySQL nicht ungefähr bestimmen kann, wie viele Zeilen es gibt zwischen zwei Werten - Wenn Hash-Indizes verwendet werden, kann der Optimierer auch keinen Hash-Index verwenden, um ORDER BY-Operationen zu beschleunigen. Denken Sie daran, dass Hash-Indizes nicht das einzige sind, was die MEMORY-Engine unterstützt – MEMORY-Engines können auch B-Tree-Indizes haben.

Indexkardinalität in MySQL

Was MySQL-Indizes betrifft, haben Sie vielleicht auch noch einen anderen Begriff gehört - dieser Begriff heißt Indexkardinalität. Sehr einfach ausgedrückt bezieht sich die Indexkardinalität auf die Eindeutigkeit von Werten, die in einer Spalte gespeichert sind, die einen Index verwendet. Um die Indexkardinalität eines bestimmten Index anzuzeigen, können Sie einfach auf die Registerkarte Struktur von phpMyAdmin gehen und die Informationen dort beobachten oder Sie können auch eine SHOW INDEXES-Abfrage ausführen:

mysql> SHOW INDEXES FROM demo_table;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table |          1 | demo     |            1 | demo        | A         |      494573 |     NULL | NULL   |      | BTREE      |         |               |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

Die Ausgabe der SHOW INDEXES-Abfrage, die oben zu sehen ist, hat viele Felder, von denen eines die Indexkardinalität darstellt:Dieses Feld gibt eine geschätzte Anzahl eindeutiger Werte im Index zurück - die Je höher die Kardinalität, desto größer ist die Wahrscheinlichkeit, dass der Abfrageoptimierer den Index für Suchen verwendet. Abgesehen davon hat die Indexkardinalität auch einen Bruder - sein Name ist Indexselektivität.

Indexselektivität in MySQL

Eine Indexselektivität ist die Anzahl unterschiedlicher Werte im Verhältnis zur Anzahl der Datensätze in der Tabelle. Einfach ausgedrückt definiert die Indexselektivität, wie eng ein Datenbankindex MySQL dabei hilft, die Suche nach Werten einzugrenzen. Eine ideale Indexselektivität ist der Wert 1. Eine Indexselektivität wird berechnet, indem die unterschiedlichen Werte in einer Tabelle durch die Gesamtzahl der Datensätze geteilt werden, z. B. wenn Sie 1.000.000 Datensätze in Ihrer Tabelle haben, aber nur 100.000 davon unterschiedliche Werte sind , wäre Ihre Indexselektivität 0,1. Wenn Ihre Tabelle 10.000 Datensätze enthält und 8.500 davon eindeutige Werte sind, beträgt Ihre Indexselektivität 0,85. Das ist viel besser. Du verstehst es. Je höher Ihre Indexselektivität ist, desto besser.

Indizes in MySQL abdecken

Ein abdeckender Index ist eine spezielle Art von Index in InnoDB. Wenn ein abdeckender Index verwendet wird, werden alle erforderlichen Felder für eine Abfrage durch den Index eingeschlossen oder „abgedeckt“, was bedeutet, dass Sie auch die Vorteile nutzen können, anstatt der Daten nur den Index zu lesen. Wenn nichts anderes hilft, könnte ein abdeckender Index Ihr Ticket für eine verbesserte Leistung sein. Zu den Vorteilen der Verwendung von abdeckenden Indizes gehören:

  • Eines der Hauptszenarien, in denen ein abdeckender Index nützlich sein könnte, ist das Verarbeiten von Abfragen ohne zusätzliche E/A-Lesevorgänge auf großen Tischen.

  • MySQL kann auch auf weniger Daten zugreifen, da Indexeinträge kleiner sind als die Zeilengröße.

  • Die meisten Speicher-Engines cachen Indizes besser als Daten.

Das Erstellen von abdeckenden Indizes für eine Tabelle ist ziemlich einfach - decken Sie einfach die Felder ab, auf die durch SELECT-, WHERE- und GROUP BY-Klauseln zugegriffen wird:

ALTER TABLE demo_table ADD INDEX index_name(column_1, column_2, column_3);

Denken Sie daran, dass es beim Umgang mit abdeckenden Indizes sehr wichtig ist, die richtige Reihenfolge der Spalten im Index zu wählen. Damit Ihre abdeckenden Indizes effektiv sind, platzieren Sie die Spalten, die Sie mit WHERE-Klauseln verwenden, zuerst, ORDER BY und GROUP BY als nächstes und die Spalten, die mit der SELECT-Klausel verwendet werden, zuletzt.

Indizierungsstrategien in MySQL

Das Befolgen der Ratschläge in diesen drei Teilen von Blog-Posts über Indizes in MySQL kann Ihnen eine wirklich gute Grundlage bieten, aber es gibt auch ein paar Indizierungsstrategien, die Sie vielleicht anwenden möchten, wenn Sie möchten Nutzen Sie die Leistungsfähigkeit von Indizes in Ihrer MySQL-Architektur wirklich. Damit Ihre Indizes den Best Practices von MySQL entsprechen, beachten Sie Folgendes:

  1. Isolieren der Spalte, für die Sie den Index verwenden – im Allgemeinen verwendet MySQL keine Indizes, wenn die Spalten sie sind verwendet werden, sind nicht isoliert. Beispielsweise würde eine solche Abfrage keinen Index verwenden, da er nicht isoliert ist:

    SELECT demo_column FROM demo_table WHERE demo_id + 1 = 10;


    Eine solche Abfrage würde jedoch:
     

    SELECT demo_column FROM demo_table WHERE demo_id = 10;

  2. Verwenden Sie keine Indizes für die Spalten, die Sie indizieren. Die Verwendung einer Abfrage wie dieser würde beispielsweise nicht viel nützen, daher ist es besser, solche Abfragen zu vermeiden, wenn Sie können:
     

    SELECT demo_column FROM demo_table WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(column_date) <= 10;

  3. Wenn Sie LIKE-Abfragen zusammen mit indizierten Spalten verwenden, vermeiden Sie es, den Platzhalter am Anfang der Suchanfrage zu setzen, weil Auf diese Weise verwendet MySQL auch keinen Index. Anstatt Abfragen wie diese zu schreiben:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘%search query%’;


    Erwägen Sie, sie so zu schreiben:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘search_query%’;


    Die zweite Abfrage ist besser, da MySQL weiß, womit die Spalte beginnt, und Indizes effektiver verwenden kann. Wie bei allem kann die EXPLAIN-Anweisung eine große Hilfe sein, wenn Sie sicherstellen möchten, dass Ihre Indizes tatsächlich von MySQL verwendet werden.

ClusterControl verwenden, um Ihre Abfragen leistungsfähig zu halten

Wenn Sie Ihre MySQL-Leistung verbessern möchten, sollten Sie die obigen Ratschläge auf den richtigen Weg bringen. Wenn Sie jedoch das Gefühl haben, dass Sie etwas mehr brauchen, ziehen Sie ClusterControl for MySQL in Betracht. Eines der Dinge, bei denen ClusterControl Ihnen helfen kann, ist das Leistungsmanagement – ​​wie bereits in früheren Blogbeiträgen erwähnt, kann ClusterControl Ihnen auch dabei helfen, Ihre Abfragen jederzeit optimal auszuführen – das liegt daran, dass ClusterControl auch eine Abfrage enthält Monitor, mit dem Sie die Leistung Ihrer Abfragen überwachen, langsame, lange laufende Abfragen und auch Abfrageausreißer sehen können, die Sie vor möglichen Engpässen in Ihrer Datenbankleistung warnen, bevor Sie sie möglicherweise selbst bemerken:

Sie können Ihre Abfragen sogar filtern, sodass Sie annehmen können, ob es sich um einen Index handelt wurde von einer einzelnen Abfrage verwendet oder nicht:

ClusterControl kann ein großartiges Tool sein, um die Leistung Ihrer Datenbank zu verbessern und Ihnen gleichzeitig den Wartungsaufwand abzunehmen. Um mehr darüber zu erfahren, was ClusterControl tun kann, um die Leistung Ihrer MySQL-Instanzen zu verbessern, sollten Sie einen Blick auf die ClusterControl for MySQL-Seite werfen.

Zusammenfassung

Wie Sie wahrscheinlich bereits erkennen können, sind Indizes in MySQL ein sehr komplexes Gebilde. Um den besten Index für Ihre MySQL-Instanz auszuwählen, wissen Sie, was Indizes sind und was sie tun, kennen Sie die Arten von MySQL-Indizes, kennen Sie ihre Vor- und Nachteile, informieren Sie sich darüber, wie MySQL-Indizes mit Speicher-Engines interagieren, und werfen Sie auch einen Blick auf ClusterControl für MySQL, wenn Sie der Meinung sind, dass die Automatisierung bestimmter Aufgaben im Zusammenhang mit Indizes in MySQL Ihren Tag erleichtern könnte.