Eine langsame Seite ist meist eine langsame Abfrage, kein langsamer Server. MySQL sagt Ihnen, welche, wenn Sie fragen - und das Fragen kostet eine Einstellung.
Einschalten
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Eine Sekunde ist ein guter Anfangswert: Sie erwischt, worauf es ankommt, ohne die Platte zu füllen. Machen Sie es in my.cnf dauerhaft, sobald Sie wissen, dass es nützt.
Lesen
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
Das sortiert nach Gesamtzeit und druckt die zehn schlimmsten. Eine Abfrage, die 0,2 s braucht, aber dreihundertmal pro Seite läuft, ist schlimmer als eine, die einmal 2 s braucht - und genau das zeigt diese Reihenfolge.
Fragen, warum sie langsam ist
EXPLAIN SELECT ... ;
- type: ALL - ein voller Tabellenscan. Jede Zeile gelesen, um eine Frage zu beantworten.
- rows: eine große Zahl - wie viele zu lesen sie erwartet. Vergleichen Sie das damit, wie viele Sie zurückerwarten.
- Using filesort - Sortieren im Speicher oder auf der Platte, weil kein Index die Reihenfolge liefert.
Der Index, der es meist behebt
Ein Index auf der Spalte in der WHERE-Klausel. Filtert die Abfrage über zwei Spalten, dann ein Index über beide, in der Reihenfolge, in der die Abfrage sie benutzt.
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
Ein Index ist nicht umsonst: Er macht Schreibvorgänge langsamer und braucht Platz. Setzen Sie den, den das Log benannt hat, und messen Sie erneut. Auf jede Spalte einen Index zu legen ist der Weg, auf dem eine Datenbank langsamer wird.
Führen Sie danach EXPLAIN erneut aus. Steht type immer noch auf ALL, wird der Index nicht benutzt - meist, weil die Abfrage die Spalte in eine Funktion einpackt, und dagegen hilft kein Index.