Halaman yang lambat biasanya berarti satu kueri yang lambat, bukan server yang lambat. MySQL akan memberi tahu Anda yang mana kalau Anda bertanya, dan bertanya itu hanya berongkos satu pengaturan.
Nyalakan ia
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Satu detik adalah ambang yang bagus untuk memulai: ia menangkap yang berarti tanpa memenuhi cakram. Jadikan menetap di my.cnf begitu Anda tahu ia berguna.
Bacalah ia
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
Itu mengurutkan menurut waktu total dan mencetak sepuluh yang terburuk. Kueri yang makan 0,2 detik tetapi berjalan tiga ratus kali per halaman lebih buruk daripada yang makan 2 detik sekali saja, dan urutan ini memperlihatkannya.
Tanyakan mengapa ia lambat
EXPLAIN SELECT ... ;
- type: ALL - pemindaian tabel secara penuh. Setiap baris dibaca demi menjawab satu pertanyaan.
- rows: sebuah angka besar - berapa baris yang diperkirakannya akan dibaca. Bandingkan dengan berapa yang Anda harapkan kembali.
- Using filesort - pengurutan di memori atau di cakram, karena tak ada indeks yang memberikan urutannya.
Indeks yang biasanya membereskannya
Sebuah indeks pada kolom yang ada di klausa WHERE. Kalau kuerinya menyaring atas dua kolom, satu indeks yang mencakup keduanya, dalam urutan yang dipakai kueri itu.
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
Indeks itu tidak gratis: ia memperlambat penulisan dan memakan cakram. Tambahkan yang disebutkan catatannya, lalu ukur lagi. Menambahkan indeks pada setiap kolom adalah cara sebuah basis data menjadi lebih lambat.
Jalankan EXPLAIN lagi sesudah menambahkannya. Kalau type-nya masih ALL, indeksnya tidak dipakai - biasanya karena kuerinya membungkus kolom itu dalam sebuah fungsi, dan tak ada indeks yang bisa menolong soal itu.