Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

JSON_STORAGE_FREE() – Descubra quanto espaço de armazenamento foi liberado após uma atualização de um documento JSON no MySQL


No MySQL, o JSON_STORAGE_FREE() A função mostra quanto espaço de armazenamento foi liberado após a atualização de um documento JSON.

Para um valor de coluna JSON, ele mostra quanto espaço de armazenamento foi liberado em sua representação binária depois que foi atualizado no local usando JSON_SET() , JSON_REPLACE() , ou JSON_REMOVE() .

Para um documento JSON (ou uma string que pode ser analisada como uma), esta função retorna 0 .


Sintaxe


A sintaxe fica assim:
JSON_STORAGE_FREE(json_val)

Onde json_val representa o documento JSON para o qual retornar a quantidade de bytes liberados após uma atualização. Este pode ser um nome de coluna. Também pode ser um documento JSON válido ou uma string que pode ser analisada como um - como um valor literal ou como o valor de uma variável do usuário - nesse caso, a função retorna 0 .

Exemplo


Executamos uma consulta:
SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

E obtenha os seguintes dados:
+-------------------------------------+
| Contents                            |
+-------------------------------------+
| {"Name": "Homer", "Stupid": "True"} |
+-------------------------------------+

Vamos verificar o tamanho do armazenamento do Contents coluna e veja se algum espaço foi liberado por uma atualização.
SELECT 
  JSON_STORAGE_SIZE(Contents) Size,
  JSON_STORAGE_FREE(Contents) Free
FROM Collections
WHERE CollectionId = 4;

Resultado:
+------+------+
| Size | Free |
+------+------+
|   40 |    0 |
+------+------+

Nesse caso, os dados usam até 40 bytes de espaço de armazenamento e nenhum espaço foi liberado por nenhuma atualização.

Mas podemos mudar isso.

Vamos fazer uma atualização.
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

Vamos executar outra consulta para ver os dados atualizados.
SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

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

Portanto, o valor "True" foi alterado para 1 .

Agora vamos ver quanto espaço foi liberado com essa atualização.
SELECT 
  JSON_STORAGE_SIZE(Contents) Size,
  JSON_STORAGE_FREE(Contents) Free
FROM Collections
WHERE CollectionId = 4;

Resultado:
+------+------+
| Size | Free |
+------+------+
|   40 |    5 |
+------+------+

Esse resultado mostra que ocorreu uma atualização parcial do documento JSON e que isso liberou 5 bytes de espaço de armazenamento. O resultado retornado por JSON_STORAGE_SIZE() é inalterado pela atualização parcial.

Atualizações parciais são suportadas para atualizações usando JSON_SET() , JSON_REPLACE() , ou JSON_REMOVE() .

Atualizações não parciais


A atribuição direta de um valor a uma coluna JSON não pode ser parcialmente atualizada e, portanto, isso resultará em nenhum espaço liberado sendo relatado.

O mesmo vale para uma variável de usuário JSON.

Aqui está um exemplo para demonstrar.

Primeiro vamos definir a variável:
SET @data = '{"Name": "Homer", "Stupid": "True"}';
SELECT 
  JSON_STORAGE_SIZE(@data) Size,
  JSON_STORAGE_FREE(@data) Free;

Resultado:
+------+------+
| Size | Free |
+------+------+
|   40 |    0 |
+------+------+

Agora atualizamos a variável 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 |
+------+------+

Portanto, neste caso, nenhum espaço foi liberado. No entanto, observe também que o JSON_STORAGE_SIZE() A função agora relata o menor número de bytes (35) usado para armazenar o documento.