sql >> データベース >  >> RDS >> Mysql

JSON_STORAGE_FREE()–MySQLでJSONドキュメントを更新した後に解放されたストレージスペースの量を確認する

    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)を報告するようになりました。


    1. MySQLで週ごとの成長率を計算する方法

    2. Oracleでの現在までの文字列(ミリ秒単位)

    3. テーブルの列の順序について心配する理由はありますか?

    4. 連続する連続番号のグループの境界を見つける方法は?