Consejos para BBDD MySQL
(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)