En alguna otra entrada ya he comentado que InnoDB debería ser el motor que utilicemos en la gran mayoría de casos, pues tiene muchas ventajas sobre otros motores como MyISAM. No obstante, en algunos casos debemos mantener tablas con MyISAM por razones de rendimiento.

Si se da esta situación, nos interesa optimizar MySQL al máximo para ofrecer el mejor rendimiento sobre estas tablas. Lamentablemente, MyISAM no permite (al contrario que InnoDB) realizar caché o buffer de los datos de las tablas, por lo que las posibilidades de optimización de estas tablas son muy limitadas. Aún así, voy a explicarlos las dos posibles optimizaciones posibles.

key_buffer_size

Este valor es el más importante en cuanto a la optimización de tablas MyISAM, y es que el único «dato» que podemos cachear en tablas MyISAM son los índices, por lo que nos interesa cachear los mismos estableciendo un valor de key_buffer_size apropiado.

¿Cómo calcular el valor apropiado?  Con el siguiente comando:

SELECT CONCAT(ROUND(KBS/POWER(1024,  IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),  SUBSTR(' KMG',IF(PowerOf1024<0,0,  IF(PowerOf1024>3,0,PowerOf1024))+1,1))  recommended_key_buffer_size FROM  (SELECT LEAST(POWER(2,32),KBS1) KBS  FROM (SELECT SUM(index_length) KBS1  FROM information_schema.tables  WHERE engine='MyISAM' AND  table_schema NOT IN ('information_schema','mysql')) AA ) A,  (SELECT 2 PowerOf1024) B;

Este comando nos calculará el tamaño total de los indices de las tablas MyISAM y nos devolverá el key_buffer_size recomendado:

+-----------------------------+
| recommended_key_buffer_size |
+-----------------------------+
| 4096M                       |
+-----------------------------+

read_buffer_size y read_rnd_buffer_size

Si bien en MyISAM no es posible cachear datos a nivel global, si es posible establecer una caché de los mismos para cada conexión que se establece contra MySQL. Los parámetros read_buffer_size y read_rnd_buffer_size nos permiten establecer el tamaño de esta caché. Hay que tener cuidado con que valores establecemos pues podemos obtener el resultado opuesto al esperado, pero si establecemos un valor correcto podemos maximizar mucho la velocidad en las consultas sobre nuestras tablas MyISAM, sobretodo si debemos realizar un full-scan.

¿Cómo obtener un valor correcto? Pues realizando pruebas, concretamente, realizando queries que fuercen un full-scan de la tabla.
Un buen valor para empezar son, por ejemplo, 32K (Siempre múltiplos de 4K), y cuidado con sobredimensionar estos parámetros, pues puede dar peor rendimiento

 


0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *