Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwendung von Indizes zur Verbesserung der MySQL-Abfrageleistung

Dieser Artikel behandelt Indizes und wie Sie sie verwenden können, um die Abfrageleistung von MySQL-Datenbanken zu verbessern.

Datenbankleistung und Indizes

Datenbankindizes in MySQL ermöglichen es Ihnen, die Leistung von SELECT zu beschleunigen Abfrageanweisungen. Bei kleinen Tabellen hilft ein Index nicht viel. Wenn Sie jedoch Tabellen mit einer großen Datenmenge haben, können Indizes die Leistung erheblich verbessern.

Die folgenden Verhaltensweisen sind alle Anzeichen dafür, dass Tabellen vom Hinzufügen von Indizes profitieren können:

  • Ihre Website wird sehr langsam oder gar nicht geladen.
  • Eine Anwendung kann keine Verbindung zu ihrer Datenbank herstellen.
  • Datenbankabfragen werden gesichert.

Wenn eines dieser Probleme auftritt, sollten Sie Ihre Datenbankabfragen analysieren und das Hinzufügen von Indizes in Betracht ziehen.

Wenn Sie einen verwalteten VPS oder einen verwalteten dedizierten Server haben, kann zusätzlich zum Hinzufügen von Indizes auch eine größere Sortierpuffergröße hilfreich sein. Bitte öffnen Sie ein Ticket im Kundenportal unter https://my.a2hosting.com, um diese Option mit unserer Guru-Crew zu besprechen.

Datenbankabfragen analysieren

Um festzustellen, welche Tabellen von der Verwendung von Indizes profitieren können, müssen Sie Ihre Datenbankabfragen analysieren. Die EXPLAIN SELECT Aussage hilft Ihnen dabei. Gehen Sie folgendermaßen vor, um Datenbankabfragen zu analysieren:

  1. Melden Sie sich mit SSH bei Ihrem Konto an.
  2. Geben Sie an der Eingabeaufforderung den folgenden Befehl ein und ersetzen Sie dabei Benutzername mit dem Benutzernamen Ihres A2 Hosting-Kontos und Datenbank mit dem Namen der Datenbank:
    mysql -u username -p database
  3. Geben Sie bei der Eingabeaufforderung Passwort eingeben Ihr Passwort ein. Der mysql>-Prompt erscheint.
  4. Geben Sie den folgenden SQL-Befehl ein:

    EXPLAIN SELECT * FROM table_name WHERE conditions \G
    
    Wenn Sie Ihren eigenen Anwendungscode schreiben, kennen Sie bereits die SELECT Anweisungen, die Sie zum Abrufen von Daten verwenden. Wenn Sie eine Drittanbieteranwendung wie WordPress oder PrestaShop verwenden, müssen Sie möglicherweise den Quellcode oder die Datenbankprotokolle untersuchen, um den genauen SELECT zu bestimmen Anweisungen, die zum Abrufen von Daten verwendet werden.
  5. Ausgabe von EXPLAIN SELECT -Anweisung zeigt, wie der MySQL-Abfrageoptimierer die Abfrage ausführt. Betrachten Sie beispielsweise die folgende Ausgabe:

    mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: employees
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 142
            Extra: Using where
    1 row in set (0.00 sec)
    

    In diesem Beispiel wird ausgegeben:

    • Die möglichen_Schlüssel und Schlüssel Werte sind beide NULL , was darauf hinweist, dass MySQL keinen Index hat, den es für diese Abfrage verwenden kann.
    • Die Reihen value gibt an, dass MySQL 142 Zeilen für diese Abfrage liest. Wenn die Tabelle insgesamt 142 Zeilen enthält, bedeutet dies, dass MySQL jede Zeile untersuchen muss, um die Ergebnismenge zu generieren. Dies kann bei einer großen Tabelle einige Zeit in Anspruch nehmen.

    Wenn wir andererseits einen Index namens index_name erstellen würden für den Nachnamen -Spalte generiert MySQL möglicherweise die folgende Ausgabe für dieselbe Abfrage:

    mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: employees
             type: range
    possible_keys: index_name
              key: index_name
          key_len: 22
              ref: NULL
             rows: 17
            Extra: Using where; Using index
    1 row in set (0.00 sec)
    

    Wie Sie sehen können, sind die possible_keys und Schlüssel -Werte zeigen an, dass MySQL einen Index gefunden hat, den es zur Optimierung der Abfrage verwenden kann. Außerdem liest MySQL statt aller 142 Zeilen nur 17 Zeilen, um die Ergebnismenge zu generieren. (Die Tabelle hat also 17 Zeilen, in denen der Nachname mit „T“ beginnt.) Zuletzt das Extra Der Wert gibt auch an, dass MySQL einen Index für die Abfrage verwendet.

Hinzufügen, Entfernen und Anzeigen von Indizes in einer Tabelle

Nachdem Sie Ihre Datenbankabfragen analysiert und festgestellt haben, wo die Leistungsengpässe liegen, können Sie Indizes hinzufügen. Gehen Sie dazu folgendermaßen vor:

  1. Melden Sie sich mit SSH bei Ihrem Konto an.
  2. Geben Sie an der Eingabeaufforderung den folgenden Befehl ein und ersetzen Sie dabei Benutzername mit dem Benutzernamen Ihres A2 Hosting-Kontos und Datenbank mit dem Namen der Datenbank:
    mysql -u username -p database
  3. Geben Sie bei der Eingabeaufforderung Passwort eingeben Ihr Passwort ein. Der mysql>-Prompt erscheint.
  4. Geben Sie den folgenden SQL-Befehl ein, um einer Tabelle einen Index hinzuzufügen. Ersetzen Sie Tabellenname mit dem Namen der Tabelle, index_name mit dem Namen des neuen Indexes (der beliebig sein kann) und table_column mit dem Namen der Tabellenspalte, für die Sie den Index hinzufügen möchten:

    ALTER TABLE table_name ADD INDEX index_name (table_column);
    
    Obwohl Indizes die Leistung verbessern können, können sich Indizes auch negativ auf die Leistung auswirken, wenn zu viele von ihnen vorhanden sind. Denn je mehr Indizes eine Tabelle hat, desto mehr Arbeit muss MySQL leisten, um sie auf dem neuesten Stand zu halten. Der Trick besteht darin, das richtige Gleichgewicht zwischen genügend Indizes zu finden, um die Leistung zu verbessern, aber nicht so vielen, dass sie sich negativ auf die Leistung auswirken.
  5. Um einen Index aus einer Tabelle zu entfernen, geben Sie den folgenden SQL-Befehl ein. Ersetzen Sie Tabellenname durch den Namen der Tabelle und ersetzen Sie index_name mit dem Namen des Indexes, den Sie löschen möchten:

    ALTER TABLE table_name DROP INDEX index_name;
    
  6. Um alle Indizes für eine Tabelle anzuzeigen, geben Sie den folgenden SQL-Befehl ein. Ersetzen Sie Tabellenname mit dem Namen der Tabelle:

    SHOW INDEX FROM table_name \G
    
    Nachdem Sie einen Index erstellt haben, sollten Sie EXPLAIN SELECT verwenden -Anweisung erneut, um zu sehen, wie Abfragen betroffen sind. Darüber hinaus sollten Sie die Datenbankleistung weiterhin überwachen, um festzustellen, ob es Verbesserungen gibt. Möglicherweise müssen Sie eine Reihe von Tests durchführen, um die optimale Anzahl von Indizes für Ihre Datenbank zu finden.

Weitere Informationen

  • Weitere Informationen zur MySQL-Optimierung und -Indizes finden Sie unter https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html.
  • Weitere Informationen zu ERKLÄREN Erklärung finden Sie unter https://dev.mysql.com/doc/refman/5.5/en/explain.html.