= Consejos para BBDD MySQL {{tag>bbdd mysql}} [[http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/|(del artículo Top 20+ MySQL Best Practices)]] - evitar ciertas funciones nativas de MYSQL (fecha, aleatoriedad) para evitar que no las cahee - Usar el comando EXPLAIN en nuestras sentencias SELECT para ver que hace y poder optimizarlas - Usar LIMIT 1 cuando queremos coger solo un registro - Indexar todas las columnas de la tabla que pueden ser susceptibles de una búsqueda - Usar el mismo tipo de índice y tipo de columna (character encoding) en las columnas que se usan para JOINs - No utilizar el ORDER BY RAND() LIMIT 1 para obtener una fila aleatoria - No utilizar el SELECT * - Tener siempre un ID, Primary Key, Auto_Increment, Unsigned. No utilizar VARCHAR como indices, es más lento. Una excepción son las tablas que relacionan 2 tablas muchos-a-muchos. En este caso se puede utilizar como calve primaria los 2 campos a la vez - Usar ENUM en lugar de VARCHAR (ENUM funciona como un TinyInt) siempre que sea posible - Usar PROCEDURE ANALYSE(), te da sugerencias que puedes seguir o no. - Evitar el uso del NULL en las columnas siempre que sea posible - Usar sentencias SQL preparadas (mysqli_extension, PDO), se pueden reutilizar con diferentes valores pero solo se compilan 1 vez - unbuffered Queries ( mysql_unbuffered_query() ) - guardar direcciones IP en UNSIGNED INT (4 bytes), con las funciones INET_ATON() y INET_NTOA() - Las tablas que tienen todos los campos de longitud fija son más rápidas. Las columnas del tipo VARCHAR, TEXT, BLOB no lo son. - Usar técnicas de "particionado vertical": fraccionar la tabla en varias partes en función de: - datos pocos frecuentes VS datos muy utlizados - campos con alta frecuencia de actualización (UPDATES) - OJO con lo JOIN si son muy frecuentes no valdrá la pena - Fraccionar DELETEs e INSERTs grandes en fracciones (LIMIT 1000), usleep(50000) - Ajustar las columnas a su tamaño adecuado, las columnas pequeñas son más rápidas. - Escoger correctamente la Storage Engine: - MyISAM: ideal para heavy-read, lento en escritura (+ bloqueo de tabla). Cálculo rápido de SELECT COUNT(*) - InnoDB: más compleja que MyISAM, más lenta para cosas pequeñas. Soporta bloqueo de registro (en vez de la tabla entera) - Utilizar un ORM que aproveche las transacciones (Doctrine) {{:mysql:consejos:top_20_mysql_best_practices_nettuts_.pdf|Soporte PDF del enlace}}