sql >> Database >  >> RDS >> Mysql

JSON_STORAGE_FREE() – Ontdek hoeveel opslagruimte vrijkwam na een update van een JSON-document in MySQL

In MySQL is de JSON_STORAGE_FREE() functie laat zien hoeveel opslagruimte vrijkwam nadat een JSON-document was bijgewerkt.

Voor een JSON-kolomwaarde laat het zien hoeveel opslagruimte is vrijgemaakt in zijn binaire weergave nadat het op zijn plaats was bijgewerkt met JSON_SET() , JSON_REPLACE() , of JSON_REMOVE() .

Voor een JSON-document (of een tekenreeks die als één document kan worden geparseerd), retourneert deze functie 0 .

Syntaxis

De syntaxis gaat als volgt:

JSON_STORAGE_FREE(json_val)

Waar json_val vertegenwoordigt het JSON-document waarvoor het aantal bytes moet worden geretourneerd dat is vrijgemaakt na een update. Dit kan een kolomnaam zijn. Het kan ook een geldig JSON-document zijn of een tekenreeks die als één kan worden geparseerd - hetzij als een letterlijke waarde of als de waarde van een gebruikersvariabele - in welk geval de functie 0 retourneert .

Voorbeeld

We voeren een zoekopdracht uit:

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

En krijg de volgende gegevens:

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

Laten we eens kijken naar de opslaggrootte van de Contents kolom en kijk of er ruimte is vrijgekomen door een update.

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

Resultaat:

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

In dit geval gebruiken de gegevens 40 bytes aan opslagruimte en is er geen ruimte vrijgekomen door updates.

Maar daar kunnen we verandering in brengen.

Laten we een update doen.

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

Resultaat:

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

Laten we nog een query uitvoeren om de bijgewerkte gegevens te bekijken.

SELECT Contents 
FROM Collections 
WHERE CollectionId = 4;

Resultaat:

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

Dus de waarde "True" is gewijzigd in 1 .

Laten we nu eens kijken hoeveel ruimte er is vrijgekomen met die update.

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

Resultaat:

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

Dit resultaat laat zien dat er een gedeeltelijke update van het JSON-document heeft plaatsgevonden en dat hierdoor 5 bytes aan opslagruimte is vrijgekomen. Het resultaat geretourneerd door JSON_STORAGE_SIZE() is ongewijzigd door de gedeeltelijke update.

Gedeeltelijke updates worden ondersteund voor updates met JSON_SET() , JSON_REPLACE() , of JSON_REMOVE() .

Niet-gedeeltelijke updates

De directe toewijzing van een waarde aan een JSON-kolom kan niet gedeeltelijk worden bijgewerkt, en daarom wordt er geen vrijgekomen ruimte gerapporteerd.

Hetzelfde geldt voor een JSON-gebruikersvariabele.

Hier is een voorbeeld om te demonstreren.

Eerst stellen we de variabele in:

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

Resultaat:

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

Nu werken we de variabele bij met JSON_SET() :

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

Resultaat:

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

In dit geval kwam er dus geen ruimte vrij. Merk echter ook op dat de JSON_STORAGE_SIZE() functie rapporteert nu het lagere aantal bytes (35) dat is gebruikt om het document op te slaan.


  1. Bijgewerkte Azure SQL Database Tier-opties

  2. IN-clausule met NULL of IS NULL

  3. Oracle Entity Framework - Genereer entiteit uit tabellen in verschillende schema's

  4. Null Pointer-uitzondering bij het aanroepen van getReadableDatabase()