MySQL Trucos para Optimizar Queries
Aquí dejo algunos trucos que me han sido útiles para optimizar queries.
1 - Elige el motor adecuado
Los 3 principales motores de almacenamiento mysql que uso son InnoDB, MyISAM
, y
Memory.
- InnoDB es el más lento pero necesario si se necesita hacer transacciones a nivel de registro y no de tabla como el MyISAM y si necesitas mantener la integridad referencial y no arriesgarse a corrupción de datos.
- MyISAM es mucho mas rápido que el InnoDB pero solo bloquea a nivel de tabla en transacciones. Es preferible si necesitas hacer una gran cantidad de transacciones y actualizaciones. Hay posibilidad de corrupción de datos.
- Memory es el más rápido de todos, ideal si solo vas a trabajar con datos temporalmente y no necesitas guardar toda la información. La tabla usa memoria RAM.
2 - Optimiza la Query
- Usa EXPLAIN SELECT * FROM table or EXPLAIN EXTENDED SELECT * FROM table para saber más de como se esta ejecutando tu consulta. ref. http://dev.mysql.com/doc/refman/5.0/es/explain.html
- Usa
SELECT SQL_NO_CACHE * FROM TABLE
orSELECT *, now() FROM TABLE
para no cachear la query mientas la optimizas. (Ten en cuenta que la segunda normalmente será más rápida que la segunda no importa si desactivas la caché, el sistema operativo también está implicado el el proceso de cacheo. En algunos casos es más rápido porque solo tiene que leer de memoria) . - Ten en cuenta la cláusula de ordenación order by. Cuando se usa esta clausula para ordenar un campo que no esté indexado puede producirse un filesort el cual ocurre cuando MySQL necesita un archivo para ordenar los resultados lo que ralentizar considerablemente la consulta.
3 - Crea Índices
- Crea índices para mejorar la velocidad de la query. Usa el EXPLAIN SELECT que te dará pistas sobre que campos debes indexar. El número de rows que nos muestra el EXPLAIN SELECT se debe reducir lo máximo a 1 como sea posible.
- Un índice de de múltiple columna es más efeciente en cuanto a tamaño y velocidad. Si tu query siempre va a tener la misma cantidad de parámetros tras el WHERE considera usar un índice múltiple ref. http://dev.mysql.com/doc/refman/5.0/en/optimization-indexes.html
4 - Fuerza el Índice Correcto
Usa IGNORE INDEX, FORCE INDEX, USE INDEX para elegir entre diferentes índices de los que MySQL asigna por defecto (sólo si es necesario) . ref. http://dev.mysql.com/doc/refman/5.1/en/index-hints.html
Nota
Más información en http://dev.mysql.com/doc/refman/5.0/es/optimization.html