Desde NETTUTS nos ofrecen varias técnicas de optimización para MySQL, con el objetivo de mejorar el rendimiento de nuestras aplicaciones web. Son consejos dirigidos a desarrolladores, dejando a un lado la optimización a nivel de sistemas:

1. Optimiza tus consultas para la query cache: tratar de no usar funciones no determinísticas como CURDATE, NOW o RAND, con las que MySQL decide desactivar la cache.

2. Usa el comando EXPLAIN sobre las consultas: para verificar si se usan correctamente los índices que hayas definido. Uso de explain.

3. Usa LIMIT 1 si solo quieres un registro: para que el motor de la base de datos deje de analizar registros en cuanto haya encontrado un registro que cumpla con las condiciones.

4. Indexa los campos de búsqueda: como norma general, crea un indice sobre los campos usados en el where de las consultas. Uso de full-text search.

5. Indexa y usa columnas del mismo tipo en los JOINs: es recomendable que tambien el character encoding sea exactamente el mismo.

6. No uses ORDER BY RAND(): penaliza bastante el rendimiento por lo que es recomendable usar alternativas, como hacer la ordenación a nivel de PHP.

7. Evita usar SELECT *: mejor elegir solo los campos que necesites.

8. Ten casi siempre un campo ID: primary key, auto_increment, int y unsigned. MySQL usa los primary keys en operaciones internas, por lo que es recomendable que estos se traten de un tipo de dato de tratamiento rápido.

9. Usa ENUM antes que VARCHAR: el tipo de dato ENUM es rápido y compacto, al almacenarse internamente como un TINYINT. Recomendable cuando el campo de texto solo puede coger determinados valores como por ejemplo “activo” e “inactivo”. Uso de Enum.

10. Obtén recomendaciones con PROCEDURE ANALYSE: con este comando MySQL analiza la estructura y contenido de una tabla y da recomendaciones sobre su definición. Uso de procedure analyse.

11. Intenta no definir campos que acepten el valor NULL: los NULL requieren espacio adicional y puede añadir complejidad en las comparaciones. MySQL comenta lo siguiente:

NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.

12. Considera usar unbuffered queries: en las consultas que devuelven muchos registros, puede ahorrar memoria, pudiendo empezar a trabajar sobre el resultset a partir de obtener el primer registro. Uso de unbuffered queries. MySQL lo explica así:

mysql_unbuffered_query() sends the SQL query query to MySQL without automatically fetching and buffering the result rows as mysql_query() does. This saves a considerable amount of memory with SQL queries that produce large result sets, and you can start working on the result set immediately after the first row has been retrieved as you don’t have to wait until the complete SQL query has been performed.

13. Guarda las direcciones IP como UNSIGNED INT: resulta más eficiente que hacerlo como VARCHAR y luego para hacer la conversion se pueden usar las funciones INET_ATON y INET_NTOA de MySQL o up2long y long2ip de PHP.

14.Las tablas FIXED-LENGTH (STATIC) son más rápidas: son aquellas que no tienen campos de tipo VARCHAR, TEXT o BLOB, de longitud no fija.

15. Pagina los INSERTs y UPDATEs grandes: si tienes que actualizar viente mil registros de una vez, mejor dividirlo se forma que se hagan de mil en mil, por ejemplo.

16. Elige el motor de almacenamiento adecuado: entre MyISAM e InnoDB ,según el uso de la base de datos que haga la aplicación.

17. Usa un Object Relational Mapper: como puede ser Doctrine para PHP, con el que se puede obtener ciertos beneficios en cuanto a rendimiento.

18. Cuidado con las conexiones persistentes: pueden dar problemas con la memoria y el límite de conexiones. Uso de mysql_pconnect.

Fuente: Top 20+ MySQL Best Practices