MySQLでは、JSON_STORAGE_FREE()
関数は、JSONドキュメントが更新された後に解放されたストレージスペースの量を示します。
JSON列の値の場合、JSON_SET()
を使用して所定の場所で更新された後、バイナリ表現で解放されたストレージスペースの量を示します。 、JSON_REPLACE()
、またはJSON_REMOVE()
。
JSONドキュメント(または1つとして解析できる文字列)の場合、この関数は0
を返します。 。
構文
構文は次のようになります:
JSON_STORAGE_FREE(json_val)
ここで、json_val
更新後に解放されたバイト数を返すJSONドキュメントを表します。これは列名にすることができます。また、有効なJSONドキュメント、またはリテラル値またはユーザー変数の値として1つとして解析できる文字列の場合もあります。この場合、関数は0
を返します。 。
例
クエリを実行します:
SELECT Contents FROM Collections WHERE CollectionId = 4;
そして、次のデータを取得します:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Contents
のストレージサイズを確認しましょう 列を表示し、更新によって空き容量が増えたかどうかを確認します。
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
結果:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
この場合、データは40バイトのストレージスペースを使用し、更新によってスペースが解放されていません。
しかし、それを変えることはできます。
更新しましょう。
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
結果:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
別のクエリを実行して、更新されたデータを確認しましょう。
SELECT Contents FROM Collections WHERE CollectionId = 4;
結果:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
したがって、値"True"
1
に変更されました 。
それでは、そのアップデートでどれだけのスペースが解放されたかを見てみましょう。
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
結果:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
この結果は、JSONドキュメントの部分的な更新が発生し、これにより5バイトのストレージスペースが解放されたことを示しています。 JSON_STORAGE_SIZE()
によって返される結果 部分的な更新によって変更されません。
JSON_SET()
を使用した更新では、部分的な更新がサポートされています 、JSON_REPLACE()
、またはJSON_REMOVE()
。
非部分的な更新
JSON列への値の直接割り当ては部分的に更新できないため、空き領域は報告されません。
同じことがJSONユーザー変数にも当てはまります。
実例を示します。
まず、変数を設定します:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
結果:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
次に、JSON_SET()
を使用して変数を更新します。 :
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
結果:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
したがって、この場合、スペースは解放されませんでした。ただし、JSON_STORAGE_SIZE()
にも注意してください。 関数は、ドキュメントの保存に使用されるより少ないバイト数(35)を報告するようになりました。