10 interesantes consejos a seguir para mejorar nuestras sentencias en MySQL, algunas de ellas para poder optimizar las ya creadas.
- Usa el comando explain: el comando explain te puede ayudar a identificar los Ãndices que se usan y además te proporciona más información útil.
- Usa permisos menos complejos: usar permisos más sencillos evita que se comprueben muchas condiciones en cada ejecución de una sentencia.
- Comando benchmark: este comando nos permite saber cuánto tiempo tarda en ejecutarse una expresión.
- Optimiza tus cláusulas: ya sea quitando paréntesis innecesarios, usando count(*) sin condiciones en el where ya que tira de tablas internas de MyQSL o usando la opción SQL_SMALL_RESULT para usar tablas temporales en memoria.
- Ejecuta optimize table: defragmenta una tabla después de varios borrados, el acceso a disco es algo importante a tener en cuenta.
- Evita campos de longitud variable: en tablas de frecuente actualización evita campos como VARCHAR, BLOB o TEXT.
- Usa insert delayed: solo cuando sea no importe cuando se inserten los datos.
- Prioridades en las sentencias: usa INSERT LOW_PRIORITY para darle a las consultas mayor prioridad, o usa SELECT HIGH_PRIORITY para ejecutar una consulta aunque haya otros clientes esperando.
- Haz múltiples inserciones en una única sentencia: en vez de varias sentencias de una única inserción.
- Sincroniza tipos de datos: mismos datos en tablas diferentes deben ser del mismo tipo de datos.
Yo siempre he tenido una duda, que no he resuelto por pereza, sobre el caso de ejecutar count(*) o count(1). La leyenda urbana dice que es mejor count(1), ya que de la otra forma obtienes que enviar todas las columnas, al igual que haces en un select *. Un consultor en Oracle nos dijo que era falsa esa afirmación porque tardaba lo mismo, yo creo que también, entre otras cosas porque seguro que ese punto está optimizado, pero claro, que sea consultor o que sea de Oracle no quiere decir nada, y menos aún si hablamos de otras bases de datos.
10 tips for optimizing mysql queries
VÃa / Alex Sancho