sql >> Base de Datos >  >> RDS >> Mysql

JSON_STORAGE_FREE():descubra cuánto espacio de almacenamiento se liberó después de una actualización de un documento JSON en MySQL

En MySQL, el JSON_STORAGE_FREE() La función muestra cuánto espacio de almacenamiento se liberó después de actualizar un documento JSON.

Para un valor de columna JSON, muestra cuánto espacio de almacenamiento se liberó en su representación binaria después de actualizarse usando JSON_SET() , JSON_REPLACE() o JSON_REMOVE() .

Para un documento JSON (o una cadena que se puede analizar como tal), esta función devuelve 0 .

Sintaxis

La sintaxis es así:

JSON_STORAGE_FREE(json_val)

Donde json_val representa el documento JSON para el que devolver la cantidad de bytes liberados después de una actualización. Esto puede ser un nombre de columna. También puede ser un documento JSON válido o una cadena que se puede analizar como uno, ya sea como un valor literal o como el valor de una variable de usuario, en cuyo caso la función devuelve 0 .

Ejemplo

Ejecutamos una consulta:

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

Y obtén los siguientes datos:

+-------------------------------------+
| Contents                            |
+-------------------------------------+
| {"Name": "Homer", "Stupid": "True"} |
+-------------------------------------+

Verifiquemos el tamaño de almacenamiento del Contents y vea si se ha liberado espacio con una actualización.

SELECT 
  JSON_STORAGE_SIZE(Contents) Size,
  JSON_STORAGE_FREE(Contents) Free
FROM Collections
WHERE CollectionId = 4;

Resultado:

+------+------+
| Size | Free |
+------+------+
|   40 |    0 |
+------+------+

En este caso, los datos utilizan hasta 40 bytes de espacio de almacenamiento y ninguna actualización ha liberado espacio.

Pero podemos cambiar eso.

Hagamos una actualización.

UPDATE Collections
SET Contents = JSON_SET(Contents, "$.Stupid", 1)
WHERE CollectionId = 4;

Resultado:

Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Ejecutemos otra consulta para ver los datos actualizados.

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

Resultado:

+--------------------------------+
| Contents                       |
+--------------------------------+
| {"Name": "Homer", "Stupid": 1} |
+--------------------------------+

Entonces el valor "True" se ha cambiado a 1 .

Ahora veamos cuánto espacio se liberó con esa actualización.

SELECT 
  JSON_STORAGE_SIZE(Contents) Size,
  JSON_STORAGE_FREE(Contents) Free
FROM Collections
WHERE CollectionId = 4;

Resultado:

+------+------+
| Size | Free |
+------+------+
|   40 |    5 |
+------+------+

Este resultado muestra que se produjo una actualización parcial del documento JSON y que esto liberó 5 bytes de espacio de almacenamiento. El resultado devuelto por JSON_STORAGE_SIZE() no ha cambiado por la actualización parcial.

Las actualizaciones parciales son compatibles con las actualizaciones que usan JSON_SET() , JSON_REPLACE() o JSON_REMOVE() .

Actualizaciones no parciales

La asignación directa de un valor a una columna JSON no se puede actualizar parcialmente y, por lo tanto, no se informará sobre el espacio liberado.

Lo mismo se aplica a una variable de usuario JSON.

Aquí hay un ejemplo para demostrarlo.

Primero configuramos la variable:

SET @data = '{"Name": "Homer", "Stupid": "True"}';
SELECT 
  JSON_STORAGE_SIZE(@data) Size,
  JSON_STORAGE_FREE(@data) Free;

Resultado:

+------+------+
| Size | Free |
+------+------+
|   40 |    0 |
+------+------+

Ahora actualizamos la variable usando JSON_SET() :

SET @data = JSON_SET(@data, "$.Stupid", 1);
SELECT 
  JSON_STORAGE_SIZE(@data) Size,
  JSON_STORAGE_FREE(@data) Free;

Resultado:

+------+------+
| Size | Free |
+------+------+
|   35 |    0 |
+------+------+

Entonces, en este caso, no se liberó espacio. Sin embargo, también observe que JSON_STORAGE_SIZE() La función ahora informa el número más bajo de bytes (35) utilizados para almacenar el documento.