Yavaş bir sayfa genelde yavaş bir sorgudur, yavaş bir sunucu değil. Sorarsanız MySQL size hangisi olduğunu söyler ve sormak tek bir ayara mal olur.

Onu açın

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

Başlangıç için bir saniye iyi bir eşiktir: diski doldurmadan önemli olanı yakalar. İşe yaradığını anladığınızda my.cnf içinde kalıcı yapın.

Onu okuyun

mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

Bu, toplam süreye göre sıralar ve en kötü onunu yazdırır. 0,2 saniye süren ama sayfa başına üç yüz kez çalışan bir sorgu, bir kez 2 saniye sürenden daha kötüdür; bu sıralama da bunu gösterir.

Neden yavaş olduğunu sorun

EXPLAIN SELECT ... ;
  • type: ALL - tam bir tablo taraması. Tek bir soruyu yanıtlamak için her satır okunuyor.
  • rows: büyük bir sayı - kaç satır okumayı beklediği. Bunu, geri gelmesini beklediğiniz satır sayısıyla karşılaştırın.
  • Using filesort - hiçbir indeks o sıralamayı vermediği için bellekte ya da diskte sıralama.

Genelde işi çözen indeks

WHERE tümcesindeki sütuna bir indeks. Sorgu iki sütuna göre süzüyorsa, ikisini birden kapsayan tek bir indeks - sorgunun onları kullandığı sırayla.

CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
İndeks bedava değildir: yazmaları yavaşlatır ve disk yer. Kaydın adını verdiğini ekleyin, sonra yeniden ölçün. Her sütuna indeks eklemek, bir veritabanının nasıl yavaşladığıdır.
Ekledikten sonra EXPLAIN'i yeniden çalıştırın. type hâlâ ALL ise indeks kullanılmıyordur - bunun sebebi genelde sorgunun sütunu bir işlevin içine sarmasıdır ve buna hiçbir indeks çare olmaz.