Una página lenta suele ser una consulta lenta, no un servidor lento. MySQL le dirá cuál si se lo pregunta, y preguntar cuesta un ajuste.
Actívelo
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Un segundo es un buen umbral para empezar: pilla lo que importa sin llenar el disco. Hágalo permanente en my.cnf cuando sepa que le sirve.
Léalo
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
Eso ordena por tiempo total e imprime las diez peores. Una consulta que tarda 0,2 s pero se ejecuta trescientas veces por página es peor que una que tarda 2 s una sola vez, y esta ordenación lo muestra.
Pregunte por qué va lenta
EXPLAIN SELECT ... ;
- type: ALL: un recorrido completo de la tabla. Todas las filas leídas para responder a una sola pregunta.
- rows: un número grande: cuántas filas espera leer. Compárelo con cuántas espera usted de vuelta.
- Using filesort: una ordenación en memoria o en disco, porque ningún índice da ese orden.
El índice que suele arreglarlo
Un índice sobre la columna de la cláusula WHERE. Si la consulta filtra por dos columnas, un solo índice sobre las dos, en el orden en que la consulta las usa.
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
Un índice no es gratis: vuelve más lentas las escrituras y ocupa disco. Añada el que nombró el registro y luego vuelva a medir. Poner un índice en cada columna es como una base de datos se vuelve más lenta.
Vuelva a ejecutar EXPLAIN después de añadirlo. Si type sigue siendo ALL, el índice no se está usando, normalmente porque la consulta envuelve la columna en una función, y contra eso no hay índice que valga.