I MySQL, JSON_STORAGE_FREE()
funktionen visar hur mycket lagringsutrymme som frigjordes efter att ett JSON-dokument uppdaterades.
För ett JSON-kolumnvärde visar det hur mycket lagringsutrymme som frigjordes i dess binära representation efter att det uppdaterades på plats med JSON_SET()
, JSON_REPLACE()
, eller JSON_REMOVE()
.
För ett JSON-dokument (eller en sträng som kan tolkas som en), returnerar den här funktionen 0
.
Syntax
Syntaxen ser ut så här:
JSON_STORAGE_FREE(json_val)
Där json_val
representerar JSON-dokumentet för vilket mängden byte som frigörs efter en uppdatering ska returneras. Detta kan vara ett kolumnnamn. Det kan också vara ett giltigt JSON-dokument eller en sträng som kan tolkas som ett – antingen som ett bokstavligt värde eller som värdet på en användarvariabel – i vilket fall funktionen returnerar 0
.
Exempel
Vi kör en fråga:
SELECT Contents FROM Collections WHERE CollectionId = 4;
Och få följande data:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Låt oss kontrollera lagringsstorleken för Contents
kolumn och se om något utrymme har frigjorts genom en uppdatering.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Resultat:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
I det här fallet använder data upp 40 byte lagringsutrymme och inget utrymme har frigjorts av några uppdateringar.
Men vi kan ändra på det.
Låt oss göra en uppdatering.
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
Resultat:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Låt oss köra en annan fråga för att se den uppdaterade informationen.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Resultat:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Så värdet "True"
har ändrats till 1
.
Låt oss nu se hur mycket utrymme som frigjordes med den uppdateringen.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Resultat:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Detta resultat visar att en partiell uppdatering av JSON-dokumentet inträffade och att detta frigjorde 5 byte lagringsutrymme. Resultatet returneras av JSON_STORAGE_SIZE()
är oförändrad av den partiella uppdateringen.
Partiella uppdateringar stöds för uppdateringar med JSON_SET()
, JSON_REPLACE()
, eller JSON_REMOVE()
.
Icke-partiella uppdateringar
Den direkta tilldelningen av ett värde till en JSON-kolumn kan inte uppdateras delvis, och därför kommer detta att resultera i att inget ledigt utrymme rapporteras.
Detsamma gäller för en JSON-användarvariabel.
Här är ett exempel att visa.
Först ställer vi in variabeln:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Resultat:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Nu uppdaterar vi variabeln med JSON_SET()
:
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Resultat:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
Så i det här fallet frigjordes inget utrymme. Observera dock också att JSON_STORAGE_SIZE()
Funktionen rapporterar nu det lägre antalet byte (35) som används för att lagra dokumentet.