MySQL ofrece una función llamada compress (y lo inverso, uncompress) que sirve para almacenar datos comprimidos, ahorrando espacio.
En este post voy a explicar cómo comprimir y descomprimir datos en MySQL con ejemplos.
Disponibilidad de compress y uncompress
El manual indica que para que estas funciones estén disponibles, el software debió ser compilado con una librería de compresión, por ejemplo, zlib.
Para comprobar que puedes comprimir y descomprimir datos ejecuta una simple consulta:
select compress("hola");
Si no hay problemas (como que la función no existe, o si devuelve null) entonces puedes continuar.
Definición de tabla para guardar un dato comprimido
Se recomienda definir el tipo de dato como BLOB o VARBINARY. Como ejemplo tenemos la siguiente tabla:
create table probar_compresion(
id bigint unsigned not null auto_increment,
original text not null,
comprimido blob not null,
primary key(id)
);
Para mostrar qué tanto espacio ahorramos guardamos ambos datos: el texto original y el comprimido.
Ahora es momento de insertar datos. Para insertar un valor comprimido hay que almacenar lo que devuelve la llamada de compress
:
insert into probar_compresion(original, comprimido)
values
(
"Para vivir, el hombre ha de considerar tres cosas como los valores supremos gobernantes de su vida: Razón, Propósito, Estima propia. La Razón como su única herramienta de conocimiento, el Propósito como su elección de la felicidad que con aquella herramienta ha de poder conseguir; la Estima propia como inviolable certidumbre de que su mente es competente para pensar y su persona digna de la felicidad, lo que significa digna de vivir.",
compress("Para vivir, el hombre ha de considerar tres cosas como los valores supremos gobernantes de su vida: Razón, Propósito, Estima propia. La Razón como su única herramienta de conocimiento, el Propósito como su elección de la felicidad que con aquella herramienta ha de poder conseguir; la Estima propia como inviolable certidumbre de que su mente es competente para pensar y su persona digna de la felicidad, lo que significa digna de vivir.")
),
(
"Keep your 'lectric eye on me babe
Put your ray gun to my head
Press your space face close to mine, love
Freak out in a moonage daydream oh yeah",
compress("Keep your 'lectric eye on me babe
Put your ray gun to my head
Press your space face close to mine, love
Freak out in a moonage daydream oh yeah")
);
Son algunos ejemplos de prueba. La inserción es correcta, ahora utilizaré la función LENGTH para medir la longitud de los datos…
select length(original), length(comprimido) from probar_compresion;
Con el siguiente resultado:
En el primer caso, el original mide 437 y el comprimido 253; en el segundo caso el original es de 140 y el comprimido de 116.
La razón de compresión no siempre será la misma, pues depende de varios factores y del algoritmo de compresión.
Lo importante es que los datos realmente se están comprimiendo. Para recuperar los datos originales se invoca a uncompress
.
select uncompress(comprimido) from probar_compresion\G
Así se puede recuperar el valor original.
Podemos hacer updates, llamar a otras funciones y todas las cosas permitidas, pues al final compress
y uncompress
son funciones de MySQL.