W MySQL funkcja JSON_STORAGE_FREE()
funkcja pokazuje, ile miejsca zostało zwolnione po zaktualizowaniu dokumentu JSON.
W przypadku wartości kolumny JSON pokazuje, ile miejsca do przechowywania zostało zwolnione w jego reprezentacji binarnej po jej zaktualizowaniu za pomocą JSON_SET()
, JSON_REPLACE()
lub JSON_REMOVE()
.
W przypadku dokumentu JSON (lub ciągu, który można przeanalizować jako jeden), ta funkcja zwraca 0
.
Składnia
Składnia wygląda tak:
JSON_STORAGE_FREE(json_val)
Gdzie json_val
reprezentuje dokument JSON, dla którego ma zostać zwrócona ilość bajtów zwolnionych po aktualizacji. Może to być nazwa kolumny. Może to być również poprawny dokument JSON lub ciąg znaków, który można przeanalizować jako jeden — jako wartość dosłowną lub jako wartość zmiennej użytkownika — w takim przypadku funkcja zwraca 0
.
Przykład
Uruchamiamy zapytanie:
SELECT Contents FROM Collections WHERE CollectionId = 4;
I uzyskaj następujące dane:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Sprawdźmy rozmiar pamięci Contents
i sprawdź, czy aktualizacja nie zwolniła miejsca.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Wynik:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
W tym przypadku dane zajmują 40 bajtów przestrzeni dyskowej i żadne miejsce nie zostało zwolnione przez jakiekolwiek aktualizacje.
Ale możemy to zmienić.
Zróbmy aktualizację.
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
Wynik:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Uruchommy kolejne zapytanie, aby zobaczyć zaktualizowane dane.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Wynik:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Zatem wartość "True"
został zmieniony na 1
.
Zobaczmy teraz, ile miejsca zostało zwolnione dzięki tej aktualizacji.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Wynik:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Ten wynik pokazuje, że nastąpiła częściowa aktualizacja dokumentu JSON, co zwolniło 5 bajtów miejsca do magazynowania. Wynik zwrócony przez JSON_STORAGE_SIZE()
nie zmienia się po częściowej aktualizacji.
Aktualizacje częściowe są obsługiwane w przypadku aktualizacji za pomocą JSON_SET()
, JSON_REPLACE()
lub JSON_REMOVE()
.
Aktualizacje nieczęściowe
Bezpośrednie przypisanie wartości do kolumny JSON nie może być częściowo zaktualizowane, a zatem spowoduje to, że nie zostanie zgłoszone zwolnione miejsce.
To samo dotyczy zmiennej użytkownika JSON.
Oto przykład do zademonstrowania.
Najpierw ustawiamy zmienną:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Wynik:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Teraz aktualizujemy zmienną za pomocą JSON_SET()
:
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Wynik:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
Więc w tym przypadku nie zwolniono miejsca. Zauważ jednak, że JSON_STORAGE_SIZE()
funkcja zgłasza teraz mniejszą liczbę bajtów (35) używanych do przechowywania dokumentu.