Una de las diferencias clave entre JSON y JSONB está en el formato de almacenamiento de los datos. JSON guarda los datos como texto, mientras que JSONB lo hace en forma binaria. Esto significa que:
- JSON guarda los datos tal cual los pasaste. Por ejemplo, si insertas la cadena
{"title": "PostgreSQL", "tags": ["database", "SQL"]}, se guardará exactamente así. - JSONB primero parsea el objeto JSON, elimina espacios innecesarios, ordena las claves, optimiza la estructura y solo después la guarda en formato binario.
Esta optimización permite que JSONB trabaje más rápido con los datos, sobre todo al hacer consultas complejas de filtrado, búsqueda y ordenación.
Rendimiento en operaciones de lectura y escritura
JSON y JSONB tienen características diferentes en cuanto a la velocidad de lectura y escritura de datos:
- JSON se escribe más rápido en la base de datos, ya que no hace falta parsear los datos antes de guardarlos. Pero la lectura y el procesamiento suelen ser más lentos, porque PostgreSQL tiene que volver a parsear los datos cada vez que haces una consulta.
- JSONB tarda más en escribir, porque los datos pasan por un procesamiento previo antes de guardarse. Pero la lectura, el filtrado y la extracción de valores son mucho más rápidos, lo que hace que JSONB sea preferible para tareas analíticas o de búsqueda.
Un ejemplo para que lo veas claro:
-- Crear tablas con JSON y JSONB
CREATE TABLE json_example (data JSON);
CREATE TABLE jsonb_example (data JSONB);
-- Insertar datos
INSERT INTO json_example VALUES ('{"key": "valor", "tags": ["json", "ejemplo"]}');
INSERT INTO jsonb_example VALUES ('{"key": "valor", "tags": ["jsonb", "ejemplo"]}');
-- Filtrar datos
SELECT * FROM json_example WHERE data->'key' = '"valor"'; -- Más lento
SELECT * FROM jsonb_example WHERE data->'key' = '"valor"'; -- Más rápido
Indexación de datos
Una de las mayores ventajas de JSONB es el soporte de indexación. PostgreSQL permite crear índices para columnas JSONB usando el tipo de índice GIN. Esto acelera mucho la búsqueda y el filtrado de datos.
Ejemplo de creación de índice:
-- Índice en columna JSONB
CREATE INDEX idx_jsonb_tags ON jsonb_example USING gin (data->'tags');
JSON, en cambio, no soporta indexación, lo que lo hace menos adecuado para operaciones de búsqueda y filtrado complejas.
Cuándo usar JSON y cuándo JSONB
JSON es mejor para situaciones donde:
- Necesitas guardar los datos tal cual, sin cambios.
- No planeas hacer muchas consultas para filtrar, buscar u ordenar por los datos JSON.
- Los datos JSON se usan sobre todo para enviarlos a otros sistemas o clientes sin modificar (por ejemplo, devolverlos al frontend por una API).
Ejemplo:
-- Guardar JSON sin analizar
CREATE TABLE api_respuestas (
id SERIAL PRIMARY KEY,
respuesta JSON
);
-- Insertar datos tal como llegan del API
INSERT INTO api_respuestas (respuesta)
VALUES ('{"estado": "éxito", "payload": {"id": 123, "nombre": "Juan"}}');
JSONB deberías usarlo si:
- Planeas filtrar, buscar, agrupar u ordenar activamente por valores dentro del JSON.
- El rendimiento de acceso a los datos es más importante que el de escritura.
- Quieres usar indexación para acelerar las operaciones con datos JSON.
Ejemplo:
-- Guardar JSONB para análisis y trabajar con objetos anidados
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
detalles JSONB
);
-- Insertar datos
INSERT INTO productos (detalles)
VALUES ('{"nombre": "Portátil", "precio": 1200, "tags": ["electrónica", "ordenadores"]}');
-- Buscar productos con el tag "electrónica"
SELECT * FROM productos
WHERE detalles @> '{"tags": ["electrónica"]}';
Más sobre el operador @> y --> lo verás en las próximas lecciones :P
Ejemplos de trabajo con JSON y JSONB
Vamos a crear dos tablas: una con columna JSON y otra con JSONB:
CREATE TABLE tabla_json (
id SERIAL PRIMARY KEY,
datos JSON
);
CREATE TABLE tabla_jsonb (
id SERIAL PRIMARY KEY,
datos JSONB
);
La inserción de datos será igual para ambas tablas:
INSERT INTO tabla_json (datos)
VALUES ('{"key": "valor", "tags": ["json", "ejemplo"]}');
INSERT INTO tabla_jsonb (datos)
VALUES ('{"key": "valor", "tags": ["jsonb", "ejemplo"]}');
Ahora vamos a extraer los datos donde la clave key tiene el valor valor:
-- Para JSON
SELECT * FROM tabla_json
WHERE datos->>'key' = 'valor';
-- Para JSONB
SELECT * FROM tabla_jsonb
WHERE datos->>'key' = 'valor';
Para volúmenes pequeños de datos, la diferencia de rendimiento será casi imperceptible. Pero si trabajas con millones de filas, JSONB dará resultados mucho mejores, sobre todo si creas un índice:
CREATE INDEX idx_jsonb_key ON tabla_jsonb USING gin ((datos->>'key'));
Trabajar con objetos anidados y arrays también es más eficiente en JSONB:
-- Extraer valor de un array
SELECT datos->'tags'->>0 AS primer_tag
FROM tabla_jsonb;
Ventajas y desventajas
| Característica | JSON | JSONB |
|---|---|---|
| Almacenamiento de datos | Guarda los datos en formato de texto original | Guarda los datos en formato binario, ordenando las claves |
| Rendimiento de escritura | Más rápido, porque se guarda "tal cual" | Más lento por el parseo previo |
| Rendimiento de lectura | Más lento, porque hay que parsear los datos al hacer la consulta | Más rápido, porque los datos ya están optimizados para lectura |
| Indexación | No soportada | Soportada (índices GIN, BTREE) |
| Filtrado | Lento | Rápido |
| Soporte de operaciones | Limitado | Ampliado |
La elección entre JSON y JSONB depende del tipo de tarea. Si solo necesitas guardar datos en texto sin modificar, elige JSON sin miedo. Pero si vas a trabajar activamente con los datos dentro de las columnas, hacer filtrados, búsquedas o agrupaciones, JSONB será más eficiente y cómodo.
Para aplicaciones complejas donde los datos JSON no son solo "almacenamiento", sino que se usan mucho en analítica, JSONB será una herramienta imprescindible. Así que si tienes dudas — elige JSONB. Puede que tu futuro "consulta más rápida de la vida" te lo agradezca ;)
GO TO FULL VERSION