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.