Una pagina lenta di solito è una query lenta, non un server lento. MySQL le dice quale, se glielo chiede, e chiederlo costa una sola impostazione.
Lo accenda
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Un secondo è una buona soglia per cominciare: prende ciò che conta senza riempire il disco. Lo renda permanente in my.cnf una volta che sa che le serve.
Lo legga
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
Questo ordina per tempo totale e stampa le dieci peggiori. Una query che impiega 0,2 s ma gira trecento volte a pagina è peggio di una che impiega 2 s una volta sola, e quest'ordine lo mostra.
Chieda perché è lenta
EXPLAIN SELECT ... ;
- type: ALL - una scansione completa della tabella. Ogni riga letta per rispondere a una sola domanda.
- rows: un numero grande - quante righe si aspetta di leggere. Lo confronti con quante se ne aspetta indietro.
- Using filesort - un ordinamento in memoria o su disco, perché nessun indice fornisce quell'ordine.
L'indice che di solito risolve
Un indice sulla colonna della clausola WHERE. Se la query filtra su due colonne, un solo indice su entrambe, nell'ordine in cui la query le usa.
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
Un indice non è gratis: rallenta le scritture e occupa disco. Aggiunga quello che il log ha nominato, poi misuri di nuovo. Mettere un indice su ogni colonna è il modo in cui un database diventa più lento.
Rilanci EXPLAIN dopo averlo aggiunto. Se type è ancora ALL, l'indice non viene usato: di solito perché la query avvolge la colonna dentro una funzione, e a questo nessun indice può rimediare.