Mysql
 sql >> Database >  >> RDS >> Mysql

JSON_STORAGE_FREE() – Scopri quanto spazio di archiviazione è stato liberato dopo un aggiornamento di un documento JSON in MySQL

In MySQL, il JSON_STORAGE_FREE() mostra quanto spazio di archiviazione è stato liberato dopo l'aggiornamento di un documento JSON.

Per un valore di colonna JSON, mostra quanto spazio di archiviazione è stato liberato nella sua rappresentazione binaria dopo che è stato aggiornato utilizzando JSON_SET() , JSON_REPLACE() o JSON_REMOVE() .

Per un documento JSON (o una stringa che può essere analizzata come uno), questa funzione restituisce 0 .

Sintassi

La sintassi è questa:

JSON_STORAGE_FREE(json_val)

Dove json_val rappresenta il documento JSON per il quale restituire la quantità di byte liberati dopo un aggiornamento. Questo può essere un nome di colonna. Può anche essere un documento JSON valido o una stringa che può essere analizzata come uno, sia come valore letterale che come valore di una variabile utente, nel qual caso la funzione restituisce 0 .

Esempio

Eseguiamo una query:

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

E ottieni i seguenti dati:

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

Verifichiamo la dimensione di archiviazione dei Contents colonna e verifica se è stato liberato spazio da un aggiornamento.

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

Risultato:

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

In questo caso, i dati utilizzano fino a 40 byte di spazio di archiviazione e nessuno spazio è stato liberato da eventuali aggiornamenti.

Ma possiamo cambiarlo.

Facciamo un aggiornamento.

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

Risultato:

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

Eseguiamo un'altra query per vedere i dati aggiornati.

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

Risultato:

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

Quindi il valore "True" è stato modificato in 1 .

Ora vediamo quanto spazio è stato liberato con quell'aggiornamento.

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

Risultato:

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

Questo risultato mostra che si è verificato un aggiornamento parziale del documento JSON e che questo ha liberato 5 byte di spazio di archiviazione. Il risultato restituito da JSON_STORAGE_SIZE() rimane invariato dall'aggiornamento parziale.

Gli aggiornamenti parziali sono supportati per gli aggiornamenti che utilizzano JSON_SET() , JSON_REPLACE() o JSON_REMOVE() .

Aggiornamenti non parziali

L'assegnazione diretta di un valore a una colonna JSON non può essere aggiornata parzialmente e pertanto non verrà segnalato spazio libero.

Lo stesso vale per una variabile utente JSON.

Ecco un esempio da dimostrare.

Per prima cosa impostiamo la variabile:

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

Risultato:

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

Ora aggiorniamo la variabile usando JSON_SET() :

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

Risultato:

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

Quindi in questo caso non è stato liberato spazio. Tuttavia, nota anche che JSON_STORAGE_SIZE() la funzione ora riporta il numero inferiore di byte (35) utilizzati per memorizzare il documento.