15 tips para optimizar MySql o MariaDB

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Amigos

Para quienes deseen optimizar su base de datos MySql acá les dejo una guía sencilla.


http://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization/


No es LA SOLUCIÓN para mejorar tus tiempos de respuesta en la base de datos (ya que no existe una solución única) sino más bien una serie de recomendaciones que deben evaluar y probar en su base de datos, y que deberían reportarles buenos resultados.

Esto es también aplicable a MariaDB.
 

K3rnelpanic

non serviam
Miembro del Equipo
MOD
Se incorporó
1 Octubre 2007
Mensajes
6.052
Buenísimo don Zuljin.

Consulta, ya que estamos hablando de bases de datos SQL, dispone ud o conoce de algún tutorial o cursillo en PDF que sea bueno para iniciarse en el mundo SQL?. Estoy con muchas ganas de aprender SQL, pero hay tanto material en línea que es algo difuso
 
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.272
Vale, lo revisare a ver cuales puedo ir aplicando :D

Sent by my Moto XXX
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Buenísimo don Zuljin.

Consulta, ya que estamos hablando de bases de datos SQL, dispone ud o conoce de algún tutorial o cursillo en PDF que sea bueno para iniciarse en el mundo SQL?. Estoy con muchas ganas de aprender SQL, pero hay tanto material en línea que es algo difuso

Voy a ver si pillo alguno. Como la gran mayoría acá, aprendí SQL con la práctica con la ayuda de un mentor en mi pega, a long time ago, así que no conozco tutoriales básicos.
 
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.272
Están buenos los tips, son lo primeros que uno aplica cuando quiere mejorar el rendimiento o evitar que se sature
Lo bueno que explica en que ayuda cada cosa

Sent by my Moto XXX
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
me voi a dar la paja de comentar y poner mi opinión sobre cada una, que los años de experiencia sirvan de algo xD:

- Enable InnoDB file-per-table: útil, muy útil, pero dependiendo del caso tb puede ser más lento que "file per database".

- Store MySQL Database Data on Separate Partition: Obviamente si pones tus datos en un SSD todas las operaciones que requieren disco van a ser más rápido. A pesar de que el artículo dice que no funciona en MariaDB, debo decir que sí funciona, de hecho tengo funcionando un server con esta configuración :sconf

- Optimizing InnoDB buffer pool Usage: Setting delicado. Tiene harta influencia en la rapidez de la db, pero no hay que irse al chancho ya que tb hay otras cosas que requieren memoria. Mi consejo? Incrementen este valor hasta que cachen que ya no pueden más. Ojo que si lo dejan por ejemplo en 1GB, el proceso MySQL les tomará 1.5GB más menos, y no será instantáneo, pero irá ocupando lo que necesite. Tb ojo con indexes demasiado grandes.

- Avoid Swappiness in MySQL: dooh ! Aunque no recomiendo desactivarlo por completo, si corren kernel 3.5+, lo recomiendo dejar en 1, sino en 10.

- Set MySQL Max Connections: Cada conexión requiere su pedazo de memoria, tengan cuidado con este setting! Bajo condiciones ideales, el número de conexiones hacia la db debería ser igual (en el mundo real un poco más alto si tenemos en cuenta sistemas de monitoreo, procesos CLI, etc) al número de conexiones a su webserver (u otra aplicación si la hay). Por el otro lado, si su aplicación no se puede conectar a la db, están sonados. Recomiendo herramientas de monitoreo (con log) para ver cuál es el valor ideal.

- Configure MySQL thread_cache_size: Tb importante para que no ocupe tanta memoria, la inicialización inicial además es más lenta.

- Disable MySQL Reverse DNS Lookups: Sólo es importante si se conectan desde TCP/IP y no desde socket (que sería el caso ideal). Para sshd siempre activo este setting dado que siempre me conecto via TCP/IP hacia SSH. Dato rosa: si se conectan a "localhost" se ocupará el socket, si se conectan a "127.0.0.1" se ocupará TCP/IP. Adicionalmente, me gusta desactivarlo por completo, cerrando toda posibilidad de conectarse remotamente.

- Configure MySQL query_cache_size: uff este... bajo ciertas condiciones, teniendo suficiente buffer pool, ocupar query_cache_size es de hecho más lento. Además hay un montón de otros requerimientos chicos, y al final uno se encuentra con miles de queries que no es necesario meter en cache, ya que obviamente hay que preferir aquellas que sí valen la pena. Mi consejo personal? Desactívenlo a menos que sepan muy bien la estructura de su base de datos y cada query que pasa por ella.

- Configure tmp_table_size and max_heap_table_size: También hay que diagnosticar este con herramientas de monitoreo. La idea detrás de esto es reducir la cantidad de tablas temporales que se tengan que escribir en disco. (Hay de dos tipos, una en RAM, la otra en disco). Hay un montón de cosas que uno le puede preguntar a la db en vivo y en directo, pero como dije, lo importante es establecer el límite de cosas que MySQL escribirá a disco. Ojo que cualquier ORDER BY, JOIN, GROUP BY, DISTINCT y otras producirá una tabla temporal, así que habrán queries gigantes que no podrán evitar mandar a disco.

- Enable MySQL Slow query Logs: Arma de doble filo. Útil pero costoso.

- Check for MySQL idle Connections: Importante, si no se pueden conectar a la db por falta de conexiones máximas, se acabó el cuento.

- Choosing Right MySQL Filesystem: Yo me iría por XFS, pq btrFS no es más rápido con archivos grandes (sí con muchos archivos chicos!) y ext4 está en retirada y será reemplazado por btrFS de todas formas.

- Set MySQL max_allowed_packet: Y por eso es que es una pésima idea de crear un BLOB en la DB. Si tienen problemas con guardar grandes datos (8MB+) en la db, este será su setting preferido.

- Check MySQL Performance Tuning: Útil, aunque prefiero las herramientas de monitoreo ya que con ellas puedo mirar en el pasado y comparar. Aunque MySQL guarda estadísticas de todo, hay algunas que son cumulativas y no se puede mirar un momento determinado en el tiempo.

- Optimize and Repair MySQL Databases: Ojalá fuera así de fantástico :(

Saludos.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Reviviendo muertos

Oye @unreal4u , ¿hay algún parámetro de memoria en que chanchamente puedas aumentarla sin preocuparte que se degrade el rendimiento?
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
respuesta corta? sí, hasta cierto punto. Pero pta... depende jajajajajaj

qué motor utilizan tus tablas? Qué versión? Cómo se ven tus queries? Qué es lo que necesitas hacer crecer?
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
respuesta corta? sí, hasta cierto punto. Pero pta... depende jajajajajaj

qué motor utilizan tus tablas? Qué versión? Cómo se ven tus queries? Qué es lo que necesitas hacer crecer?

Innodb. Sólo consultaba para subirle parámetros de memoria a todo lo que me de la máquina virtual pero esto es de puro caliente pues la aplicación consume poquito.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
Con innodb, el setting mágico sería el buffer pool, de mi post de más arriba:

- Optimizing InnoDB buffer pool Usage: Setting delicado. Tiene harta influencia en la rapidez de la db, pero no hay que irse al chancho ya que tb hay otras cosas que requieren memoria. Mi consejo? Incrementen este valor hasta que cachen que ya no pueden más. Ojo que si lo dejan por ejemplo en 1GB, el proceso MySQL les tomará 1.5GB más menos, y no será instantáneo, pero irá ocupando lo que necesite. Tb ojo con indexes demasiado grandes.

--------

SIN EMBARGO!!!!! Creo que para hacer una recomendación en serio habría que entender bien el uso de la base de datos como tal.

Saludos.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
ehmm but why? no te olvides que memcache es casi abandonware, no confiaría demasiado en eso
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
query cache no se ocupa con innodb, sólo myisam lo ocupa ;)

Por lo demás, "malogrado" es demasiado grande, query cache funciona de lo más bien, siempre y cuando lo consideres en tu setup: el único problema que tiene es que nadie lo tunea por lo que se pierde un poco el beneficio de tenerlo en primer lugar.

Saludos.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
query cache no se ocupa con innodb, sólo myisam lo ocupa ;)

Por lo demás, "malogrado" es demasiado grande, query cache funciona de lo más bien, siempre y cuando lo consideres en tu setup: el único problema que tiene es que nadie lo tunea por lo que se pierde un poco el beneficio de tenerlo en primer lugar.

Saludos.

Pera... ¿query cache es sólo para myisam?
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
mm sorry, me equivoqué!

Nosotros lo deshabilitamos en innodb justamente pq el buffer pool funciona mejor y vendría a ser el reemplazo en innodb de forma más "correcta".

Sin embargo, en determinadas situaciones puedes verte beneficiado, pero nuevamente: sin conocer tu base de datos no puedo opinar al respecto más que decirte que hay 1000 posibles opciones de tuneo, y todas ellas influyen en el comportamiento general. Sin conocer a profundidad tu base de datos y el cómo se ocupa, es imposible señalarte con certeza qué puede funcionar mejor...

Saludos.
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.400
uta nosotros partimos con un buffer pool de 40GB... fuimos tuneando y 16GB es el sweet spot para nuestra app
 
Upvote 0
Subir