Mysql
 sql >> Base de données >  >> RDS >> Mysql

JSON_STORAGE_FREE() - Découvrez combien d'espace de stockage a été libéré après une mise à jour d'un document JSON dans MySQL

Dans MySQL, le JSON_STORAGE_FREE() montre combien d'espace de stockage a été libéré après la mise à jour d'un document JSON.

Pour une valeur de colonne JSON, il montre combien d'espace de stockage a été libéré dans sa représentation binaire après sa mise à jour en place à l'aide de JSON_SET() , JSON_REPLACE() , ou JSON_REMOVE() .

Pour un document JSON (ou une chaîne qui peut être analysée comme telle), cette fonction renvoie 0 .

Syntaxe

La syntaxe ressemble à ceci :

JSON_STORAGE_FREE(json_val)

json_val représente le document JSON pour lequel renvoyer la quantité d'octets libérés après une mise à jour. Il peut s'agir d'un nom de colonne. Il peut également s'agir d'un document JSON valide ou d'une chaîne qui peut être analysée comme telle, soit comme valeur littérale, soit comme valeur d'une variable utilisateur, auquel cas la fonction renvoie 0 .

Exemple

Nous exécutons une requête :

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

Et obtenez les données suivantes :

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

Vérifions la taille de stockage du Contents colonne et voyez si de l'espace a été libéré par une mise à jour.

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

Résultat :

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

Dans ce cas, les données utilisent jusqu'à 40 octets d'espace de stockage et aucun espace n'a été libéré par les mises à jour.

Mais nous pouvons changer cela.

Faisons une mise à jour.

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

Résultat :

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

Exécutons une autre requête pour voir les données mises à jour.

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

Résultat :

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

Donc la valeur "True" a été remplacé par 1 .

Voyons maintenant combien d'espace a été libéré avec cette mise à jour.

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

Résultat :

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

Ce résultat montre qu'une mise à jour partielle du document JSON s'est produite, et que cela a libéré 5 octets d'espace de stockage. Le résultat renvoyé par JSON_STORAGE_SIZE() est inchangé par la mise à jour partielle.

Les mises à jour partielles sont prises en charge pour les mises à jour utilisant JSON_SET() , JSON_REPLACE() , ou JSON_REMOVE() .

Mises à jour non partielles

L'affectation directe d'une valeur à une colonne JSON ne peut pas être partiellement mise à jour, et par conséquent, aucun espace libéré ne sera signalé.

Il en va de même pour une variable utilisateur JSON.

Voici un exemple pour illustrer.

Nous définissons d'abord la variable :

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

Résultat :

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

Maintenant, nous mettons à jour la variable en utilisant JSON_SET() :

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

Résultat :

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

Donc, dans ce cas, aucun espace n'a été libéré. Cependant, notez également que le JSON_STORAGE_SIZE() rapporte maintenant le nombre inférieur d'octets (35) utilisés pour stocker le document.