Posiciones del IDH a nivel global en México (1982-2024).pdf
MySQL Good Database Design
1. Good Database Design
Como evaluar un buen diseño contemplando aspectos básicos:
Claves Primarias y Foráneas & Tipos de datos para texto
Nicola Strappazzon C.
@swapbytes
https://swapbytes.com
2. Agenda
• Porque optimizamos.
• Reglas generales.
• ¿Por que el primary key es tan importantes?
• ¿Cómo afectan el tipo de dato incorrecto?
• ¿Cómo analizar una tabla?
• Causa de las tablas temporales.
• Consecuencias de las tablas temporales.
• Ejemplos.
• Propiedades configuración.
• Variables de estado.
• Conclusiones.
3. Porque optimizamos
• Los recursos son finitos y tenemos que sacarle el
mejor partido a lo que tenemos.
• Picos extraños en las gráficas: Bandwidth, CPU,
RAM, Disk, IOPS…
• Optimizar tiempos de respuesta & dinero.
• No es lo mismo un cliente en local, que 1k clientes
en el servidor.
4. Reglas generales
• Usar el tipo de Engine InnoDB, Encoding UTF-8.
• Debería evitarse el uso abusivo de NULL’s.
• Todas las tablas deben tener un primary key llamado id
(PK), debe ser Autoincrement (AI), Not Null (NN), Unsigned
(U) y de tipo de dato BIGINT (18446744073709551615).
• Todos los foreign key deben ser del mismo de tipo de
datos del primary key que hace referencia, Unsigned (U) y
un tipo de dato BIGINT.
• Un UUID no debería ser un primary key / foreign key.
5. ¿Por que el primary key es tan importantes?
1. Identifica al row y permite relacionarlo en otras tablas.
2. Es un valor que no debe cambiar.
3. Identificar rows duplicados.
4. Hacer alter de las tablas sin bloqueos.
5. Cuida la replica permitiendo recuperar datos del binlog, respaldos
incrementales, evita duplicar datos.
6. Y mucho más…
Para realizar cualquier tarea a nivel de registros es
necesario tener una columna numérica & identificativa:
6. ¿Como afectan el tipo de dato incorrecto?
• char: Para búsquedas exactas de longitud fija, evita la
fragmentación de los datos por las actualización, ocupa
más espacio en disco. Max de longitud de datos es 255
bytes. Ej; email, uuid, password, token.
• varchar: Para todo lo demás que no requiera una
búsqueda exacta, es de longitud variable. Max de
longitud de datos es 65,535 bytes.
Los casos más comunes son con los tipos de datos
para texto mal implementados:
https://dev.mysql.com/doc/refman/5.7/en/char.html
7. ¿Como afectan el tipo de dato incorrecto?
• El motor de almacenamiento en memoria no admite los
tipos de datos TEXT y BLOD, las consultas que utilizan
columnas de este tipo creará de forma implícita tablas
temporales en disco.
• Se puede comprobar en la sentencia EXPLAIN la
existencia del valor “Using temporary” en la columan
Extra.
• Tiempos de respuesta lentos.
• Disco lleno.
https://dev.mysql.com/doc/refman/5.7/en/blob.html
8. ¿Cómo analizar una tabla?
Analiza cada columna de la tabla, informando del
valor mínimo y máximo, longitud minima y maxima,
cantidad de nulls, cantidad de campos vacíos y
sugiere el tipo de dato adecuado.
SELECT * FROM foo PROCEDURE ANALYSE();
https://dev.mysql.com/doc/refman/5.7/en/procedure-analyse.html
9. Causa de las tablas temporales
• Subquery
• ORDER BY
• GROUP BY
• Tipo de datos: TEXT/BLOD
https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html
10. • Las tablas temporales son de tipo MYISAM.
• El disco es más lento que la memoria RAM.
• Implementar un disco en RAM no es la mejor
opción, requiere de igual forma muchas
operaciones de IO.
Consecuencias de las tablas temporales
13. Propiedades configuración
• tmp_table_size: Cantidad maxima de memoria interna para
tablas temporales.
• max_heap_table_size: Cantidad maxima de memoria para
tablas de tipo MEMORY.
• max_sort_length: Memoria para ordenar, por conexión.
• max_allowed_packet: Cantidad maxima de memoria de los
papara el transmitir datos por red.
• sql_mode: Modos de compatibilidad.
• row_format: [DEFAULT|COMPACT|DYNAMIC|…]
14. Variables de estado
• Created_tmp_disk_tables: Cantidad de tablas
temporales en disco.
• Created_tmp_tables: Cantidad de tablas
temporales en memoria.
15. Conclusiones
• La mejor estrategia es asignar sólo el espacio que
realmente necesita.
• Columnas más grandes, utiliza más memoria.
• Monitorizar y graficar todas las variables de MySQL.