In MySQL der JSON_STORAGE_FREE()
Funktion zeigt an, wie viel Speicherplatz freigegeben wurde, nachdem ein JSON-Dokument aktualisiert wurde.
Für einen JSON-Spaltenwert zeigt es, wie viel Speicherplatz in seiner binären Darstellung freigegeben wurde, nachdem er mit JSON_SET()
an Ort und Stelle aktualisiert wurde , JSON_REPLACE()
, oder JSON_REMOVE()
.
Für ein JSON-Dokument (oder einen String, der als eins geparst werden kann) gibt diese Funktion 0
zurück .
Syntax
Die Syntax lautet wie folgt:
JSON_STORAGE_FREE(json_val)
Wobei json_val
stellt das JSON-Dokument dar, für das die Menge der nach einer Aktualisierung freigegebenen Bytes zurückgegeben werden soll. Dies kann ein Spaltenname sein. Es kann auch ein gültiges JSON-Dokument oder eine Zeichenfolge sein, die als eins geparst werden kann – entweder als Literalwert oder als Wert einer Benutzervariablen – in diesem Fall gibt die Funktion 0
zurück .
Beispiel
Wir führen eine Abfrage aus:
SELECT Contents FROM Collections WHERE CollectionId = 4;
Und erhalten Sie die folgenden Daten:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Lassen Sie uns die Speichergröße der Contents
überprüfen Spalte und prüfen Sie, ob durch ein Update Speicherplatz freigegeben wurde.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Ergebnis:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
In diesem Fall verbrauchen die Daten 40 Byte Speicherplatz, und es wurde kein Speicherplatz durch Aktualisierungen freigegeben.
Aber das können wir ändern.
Lass uns ein Update machen.
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
Ergebnis:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Lassen Sie uns eine weitere Abfrage ausführen, um die aktualisierten Daten anzuzeigen.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Ergebnis:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Also der Wert "True"
wurde in 1
geändert .
Sehen wir uns nun an, wie viel Speicherplatz durch dieses Update freigegeben wurde.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Ergebnis:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Dieses Ergebnis zeigt, dass eine teilweise Aktualisierung des JSON-Dokuments stattgefunden hat und dass dadurch 5 Byte Speicherplatz freigegeben wurden. Das von JSON_STORAGE_SIZE()
zurückgegebene Ergebnis wird durch das partielle Update nicht verändert.
Teilaktualisierungen werden für Aktualisierungen mit JSON_SET()
unterstützt , JSON_REPLACE()
, oder JSON_REMOVE()
.
Nicht teilweise Aktualisierungen
Die direkte Zuweisung eines Werts zu einer JSON-Spalte kann nicht teilweise aktualisiert werden, weshalb dies dazu führt, dass kein freigegebener Speicherplatz gemeldet wird.
Dasselbe gilt für eine JSON-Benutzervariable.
Hier ist ein Beispiel zur Veranschaulichung.
Zuerst setzen wir die Variable:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Ergebnis:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Jetzt aktualisieren wir die Variable mit JSON_SET()
:
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Ergebnis:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
In diesem Fall wurde also kein Platz freigegeben. Beachten Sie jedoch auch, dass JSON_STORAGE_SIZE()
Die Funktion meldet jetzt die niedrigere Anzahl von Bytes (35), die zum Speichern des Dokuments verwendet werden.