Imaginemos la situación. Acabas de mudar todas tus webs de un servidor compartido (Shared server) a un Servidor Virtual dedicado (VPS) y te encuentras que tienes que optimizar un monton de cosas, entre ellas tu base de datos Mysql que usabas en tus blogs de WordPress, en Drupal, Joomla o Moodle. ¿Por donde empezamos?
- ¿Cuanta RAM tenemos en nuestro servidor? Factor clave y determinante para la optimización de nuestra base de datos Mysql
- ¿Qué es lo que tengo que optimizar en Mysql? Principalmente el archivo my.cnf que encontraremos en /etc/mysql/my.cnf o /etc/my.cnf despendiendo del Sistema operativo.
- ¿Como lo edito? A través de terminal mediante una conexión ssh al servidor y gracias al editor de unix ‘vi’
- ¿Que cantidad de memoria RAM puede consumir Mysql? En función de los parametros que configuremos en my.cnf. Podemos hacernos una idea con esta calculadora de memoria RAM para Mysql
- Leemos esta biblia de optimización de MySQL, para comprender el significado de cada parametro.
Antes de empezar a hacer ningun cambio, sería mejor culturizarnos un poco. Normalmente, en nuestro servidor, podemos encontrar ejemplos de archivos my.cnf en función de la RAM que tengamos disponible:
/usr/share/doc/mysql-server-5.1/
my-small.cnf: para sistemas con 64MB de RAM (Como!!!)
my-medium.cnf: para sistemas con 256MB de RAM
my-large.cnf: para sistemas con 512MB de RAM
my-huge.cnf: para sistemas con 1-2GB de RAM
Para empezar no esta mal y nos podemos hacer una idea de cuales son los parametros más importantes a ajustar.
Comprobamos el uso que nuestro VPS hace de la memoria con los siguientes comandos en el terminal: top, ps aux y free -m
Nos familiarizamos con el aspecto que tiene un archivo my.cnf
[mysqld]
safe-show-database
open_files_limit = 5000
tmp_table_size = 95M
max_heap_table_size = 95M
query_cache_limit=2M
query_cache_size=55M ## 64MB for every 1GB of RAM
query_cache_type=1
max_connections=100
collation_server=utf8_unicode_ci
character_set_server=utf8
delayed_insert_timeout=40
interactive_timeout=10
wait_timeout=30
connect_timeout=20
thread_cache_size=64
key_buffer=16M ## 32MB for every 1GB of RAM
key_buffer_size=40M
join_buffer=1M
max_connect_errors=20
max_allowed_packet=8M
table_cache=2048
table_definition_cache=2048
record_buffer=1M
sort_buffer_size=1M ## 1MB for every 1GB of RAM
read_buffer_size=1M ## 1MB for every 1GB of RAM
read_rnd_buffer_size=1M ## 1MB for every 1GB of RAM
thread_concurrency=2 ## Number of CPUs x 2
myisam_sort_buffer_size=16M
innodb_file_per_table=1
innodb_buffer_pool_size=35M
Y la verdad es que nos es facil optimizarlo… ¿Cuales son las variables más importantes?
max_connections
wait_timeout
thread_cache_size
table_cache
key_buffer_size
query_cache_size
tmp_table_size
¿Donde encontramos más ayuda para tunear Mysql? Afortunadamente hay varios programas que nos pueden ayudar a optimizar el archivo my.cnf de Mysql (lo mejor es usar los tres y comparar resultados):
MySQLTuner, Tuning Primer y mysqlreport
Nos descargamos estos programas en nuestra carpeta /usr/local/sbin/, les damos los permisos para que se puedan ejecutar (entrando en el servidor como root) y nos preparamos para el despliegue de datos.
¡Suerte a todos! Tened en cuenta que hay que ejecutar estos programas entre 24 y 48 horas despues de haber hecho los primeros cambios en my.cnf. Dejamos pasar ese tiempo, los volvemos a ejecutar y volvemos a optimizar la bbdd editando my.cnf. ¡OJO! Después de editar el archivo hay que reiniciar Mysql a través del terminal o del panel WHM o similar, sino, los cambios en el archivo no se verán reflejados.