Startseite > Deutsch > MySQL durch Indexe beschleunigen

MySQL durch Indexe beschleunigen

Ein Kunde hatte erhebliche Probleme mit der Performance seiner Webanwendung. Die Vermutung war dass es an der MySQL Datenbank liegt, was ein Blick in die Prozessliste auch bestätigte.

Um herrauszufinden welche SQL-Anfragen lange dauern empfiehlt es sich „log_slow_queries“ bei MySQL zu aktivieren. In der entsprechenden Log-Datei sieht man dann einige Analysen zu den langsamen Querys. Die „schuldigen“ Anfragen in diesem Fall dauerten bis zu 1min (2×3,2GHz CPU) und überprüften über 39000 Zeilen über verschiedene Tabellen.
Die Lösung brachten Indexe auf die häufig verwendete Spalten in den WHERE und ORDER Klauseln. Die Geschwindigkeit verbesserte sich dadurch um den Faktor 50.

Um zu sehen welche Indexe verwendet werden kann man vor einen SQL Statement ein „EXPLAIN“ setzen.

mysql> explain select * from jos_facileforms_subrecords WHERE id=80;
+----+-------------+----------------------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table                      | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+----------------------------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | jos_facileforms_subrecords | const | PRIMARY       | PRIMARY | 4       | const |    1 |       |
+----+-------------+----------------------------+-------+---------------+---------+---------+-------+------+-------+

„id“ ist PRIMARY KEY und deswegen auch automatische in Index.

mysql> explain select * from jos_facileforms_subrecords WHERE record=80;
+----+-------------+----------------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table                      | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+----------------------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | jos_facileforms_subrecords | ALL  | NULL          | NULL | NULL    | NULL | 2353 | Using where |
+----+-------------+----------------------------+------+---------------+------+---------+------+------+-------------+

„record“ ist kein Index. Das ändern wir mit:

mysql> ALTER TABLE `jos_facileforms_subrecords` ADD INDEX ( `record` );

Der nächste Aufruf zeigt uns dass ein index verwendet wird:

mysql> explain select * from jos_facileforms_subrecords WHERE record=80;
+----+-------------+----------------------------+------+---------------+--------+---------+-------+------+-------+
| id | select_type | table                      | type | possible_keys | key    | key_len | ref   | rows | Extra |
+----+-------------+----------------------------+------+---------------+--------+---------+-------+------+-------+
|  1 | SIMPLE      | jos_facileforms_subrecords | ref  | record        | record | 4       | const |    7 |       |
+----+-------------+----------------------------+------+---------------+--------+---------+-------+------+-------+

sehr gute weiterführende Infos gibt es z.B. hier:  Optimierung von MySQL-Abfragen: Verwendung des Index

Kategorien:Deutsch Schlagwörter: , ,
  1. Es gibt noch keine Kommentare.
  1. No trackbacks yet.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: