Pongamos un ejemplo, necesitamos almacenar el año y el mes en un solo campo y se plantea la disyuntiva de utilizar un campo tipo CHAR de 7 caracteres o bien uno de tipo DATE. Vamos a analizarlo y explicar porqué es más eficiente utilizar uno de tipo DATE.
Espacio ocupado por DATE
Un campo de tipo DATE
en MySQL ocupa 3 bytes de almacenamiento fijo, independientemente de la cantidad de información contenida en el campo.
Espacio ocupado por CHAR(7)
- Un campo de tipo
CHAR(7)
ocupa 7 bytes (1 byte por carácter, ya que en un sistema de codificación como ASCII o latin1, cada carácter usa 1 byte). - Si usas una codificación multibyte como UTF-8, cada carácter puede ocupar más de 1 byte (generalmente hasta 3 bytes por carácter).
En el caso más común (usando una codificación como latin1), CHAR(7)
ocupa más espacio que DATE
, porque 7 bytes > 3 bytes
.
¿Cuánto ahorrarías?
En lugar de ahorrar espacio, usar CHAR(7)
aumentará el uso de almacenamiento en aproximadamente 4 bytes por fila.
Ejemplo de cálculo:
Si tienes 1,000,000 filas:
- Espacio con
DATE
: 3 bytes×1,000,000=3,000,000 bytes. - Espacio con
CHAR(7)
: 7 bytes×1,000,000=7,000,000.
La diferencia es:7,000,000−3,000,000=4,000,000 bytes (4 MB adicionales).7,000,000 – 3,000,000 = 4,000,000 (4 MB adicionales).
Esto en lo relativo al espacio que se utiliza. Ahora vamos a analizar la sencillez y rapidez a la hora de realizar una consulta SQL:
Ventajas del campo DATE
- Operaciones y filtros más eficientes:
- MySQL almacena internamente los campos de tipo
DATE
como números binarios (3 bytes), lo que permite realizar operaciones matemáticas, comparaciones y filtros de manera mucho más rápida y eficiente. - Ejemplo:
SELECT * FROM tabla WHERE fecha BETWEEN '2024-01-01' AND '2024-12-31';
En este caso, MySQL usa índices y optimizaciones específicas para fechas.
- MySQL almacena internamente los campos de tipo
- Facilidad para manejar intervalos:
- Puedes utilizar funciones nativas de MySQL, como
DATE_ADD
,DATE_SUB
oYEAR
yMONTH
, para realizar cálculos directamente sobre la fecha. - Ejemplo: Extraer el año y el mes:sqlCopiar código
SELECT YEAR(fecha) AS año, MONTH(fecha) AS mes FROM tabla;
- Puedes utilizar funciones nativas de MySQL, como
- Compatibilidad con rangos:
- Los rangos se procesan con operadores como
BETWEEN
, y no tienes que preocuparte por formatear cadenas para filtrar resultados.
- Los rangos se procesan con operadores como
- Validación automática:
- MySQL valida automáticamente los valores de tipo
DATE
. No permite valores inválidos (por ejemplo,2024-13
o2024-02-30
), evitando errores de datos.
- MySQL valida automáticamente los valores de tipo
Desventajas del campo CHAR(7)
- Operaciones y filtros menos eficientes:
- Los valores de tipo
CHAR(7)
se comparan como cadenas de texto, lo cual es más lento que la comparación de fechas almacenadas en formato binario. - Para realizar operaciones como comparar rangos, tienes que convertir manualmente los valores o diseñar las consultas cuidadosamente.
- Ejemplo: Para filtrar por rango:
SELECT * FROM tabla WHERE fecha_formateada BETWEEN '2024-01' AND '2024-12';
- Los valores de tipo
- Mayor complejidad al trabajar con la información:
- Si necesitas calcular el rango de meses o extraer el año, debes usar operaciones adicionales como
SUBSTRING
o convertir la cadena de texto, lo cual es más complicado y menos eficiente. - Ejemplo:
SELECT SUBSTRING(fecha_formateada, 1, 4) AS año, SUBSTRING(fecha_formateada, 6, 2) AS mes FROM tabla;
- Si necesitas calcular el rango de meses o extraer el año, debes usar operaciones adicionales como
- Mayor riesgo de datos inconsistentes:
- MySQL no valida automáticamente los datos en un campo de tipo
CHAR(7)
. Esto significa que podrías almacenar valores inválidos (por ejemplo,2024-13
oabcd-ef
), lo cual complica las consultas y los resultados.
- MySQL no valida automáticamente los datos en un campo de tipo
La conclusión es clara, debe utilizarse el campo de tipo DATE.