MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?

MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?

最近、上位コンピュータが下位コンピュータから報告されたデータを取得するプロジェクトがありました。報告頻度が高く、データ量が多いため、データが急速に増加し、ディスクを大量に占有しました。

コストを節約するには、データを定期的にバックアップし、 deleteコマンドを使用してテーブル レコードを削除します。

deleteは実行されましたが、テーブルファイルのサイズが減少していないため、不可解です。

このプロジェクトでは、データベースとしてMysqlを使用します。テーブルの場合、通常はテーブル構造とテーブルデータです。テーブル構造が占めるスペースは比較的小さく、通常はテーブルデータが占めるスペースになります。

delete使用してデータを削除すると、テーブル内のデータ レコードは確かに削除されますが、テーブル ファイルのサイズは変更されません。

1.MySQLデータ構造

mysqlを使用したことがある人なら、 B+樹について聞いたことがあるはずです。MySQL MySQL InnoDB 、データを格納するための構造としてB+ツリー (インデックス構成テーブルとも呼ばれます) を使用し、データはページごとに格納されます。したがって、データを削除する場合、次の 2 つの状況が考えられます。

  • データページ内のいくつかのレコードを削除する
  • データページ全体の内容を削除する

2. テーブルファイルのサイズは変更されておらず、MySQLの設計に関連しています

たとえば、レコード R4 を削除する場合は、次のようにします。

InnoDB 、再利用可能な場所と呼ばれるレコードR4直接削除済みとしてマークします。後でID300から700までのレコードを挿入すると、この位置が再利用されます。

ディスクファイルのサイズは縮小されないことがわかります。

通常、ページ全体のデータを削除すると、レコード マークも削除され、その位置でデータが再利用されます。これは、ページ全体のレコードを削除するときに、後で挿入されたデータが元の範囲内にない場合に位置を再利用できるという点で、ディクテーション レコードの削除とは異なります。ただし、ディクテーション レコードのみを削除する場合は、削除されたレコードの位置に一致するデータを挿入してから、再利用する必要があります。

したがって、データ行またはデータ ページが削除された場合でも、再利用のために削除済みとしてマークされるため、ファイル サイズは縮小されません。

3. テーブルのサイズを小さくするにはどうすればよいでしょうか?

DELETEデータ マーカーを削除するだけで、データ ファイルの断片化を解消しません。新しいデータが挿入されると、削除済みとしてマークされたレコード領域が再び使用されます。OPTIMIZE OPTIMIZE TABLE使用すると、未使用の領域を再利用し、データ ファイルを断片化を解消できます。

OPTIMIZE TABLE テーブル名;


注意: OPTIMIZE TABLE MyISAMBDB 、およびInnoDBテーブルに対してのみ機能します。

あるいは、 ALTER TABLEを使用してテーブルを再構築することもできます。

ALTER TABLE テーブル名 ENGINE=INNODB


OPTIMIZE TABLEALTER TABLEの違いは何かと尋ねる人もいるかもしれません。

alter table t engine = InnoDB (つまり、再作成)、 optimize table t recreate+analyzeに等しい

4. オンラインDDL

最後に、 Online DDLについてお話ししましょう。DBA dba日常業務の 1 つは、間違いなく DDL の変更です。DDL の変更はテーブルをロックしますが、これはdbaにとって永遠の悩みの種と言えます。特にddl変更を実行すると、ライブラリ上の多数のスレッドが「 Waiting for meta data lock 」の状態になります。そのため、バージョン 5.6 以降ではOnline DDLが導入されました。

Online DDLがリリースされる前は、 DDL を実行する主な方法は、 copyinplace 2 つでした。 inplace方式は ( fast index creation ) とも呼ばれます。 copy方式と​​比較すると、 inplace方式ではデータがコピーされないため、高速になります。ただし、この方法はインデックスの追加と削除のみをサポートしており、コピー方法と同様に、プロセス全体を通じてテーブルをロックする必要があるため、あまり実用的ではありません。前の 2 つの方法と比較すると、 Online方式では読み取りだけでなく書き込み操作もサポートされます。

online DDLステートメントを実行するときは、 ALGORITHMキーワードとLOCKキーワードを使用します。これらの 2 つのキーワードは、 DDLステートメントの最後にあり、カンマで区切られています。次に例を示します。

ALTER TABLE tbl_name ADD COLUMN col_name col_type、ALGORITHM=INPLACE、LOCK=NONE;


アルゴリズムオプション

  • INPLACE:置換: 元のテーブルに対して直接DDL操作を実行します。
  • COPY:コピー: 一時テーブルを使用して一時テーブルを複製し、一時テーブルでDDLを実行してから、一時テーブルにデータをインポートし、名前を変更するなどします。この期間中、このような操作をサポートするには 2 倍のディスク容量が必要になります。実行中は、テーブルに対するDML操作は許可されません。
  • DEFAULT: MySQL自体によって選択されるデフォルトの方法で、 INPLACEメソッドが最初に使用されます。
  • ロックオプション
  • SHARE:共有ロック。DDL DDL実行されるテーブルは読み取り可能ですが、書き込みはできません。
  • なし:制限はありません。DDL DDL実行されるテーブルは読み取りおよび書き込み可能です。
  • EXCLUSIVE:排他ロック。DDL DDL実行されるテーブルは読み取りも書き込みもできません。
  • DEFAULT:デフォルト値。DDL DDLLOCK句が指定されていない場合に使用されるデフォルト値です。指定されたLOCK値が

DEFAULT 、つまり、テーブルをロックするかどうかはMySQLによって決定されます。推奨されません。DDL DDLがテーブルをロックしないことが確実な場合は、 lockを指定したり、その値をdefault指定したりすることはできません。それ以外の場合は、ロック タイプを指定することをお勧めします。
DDL操作を実行する場合、 ALGORITHMオプションを指定する必要はありません。この場合、 MySQL INSTANTINPLACECOPYの順に適切なモードを自動的に選択します。同じ効果を持つALGORITHM=DEFAULTを指定することもできます。 ALGORITHMオプションが指定されているがサポートされていない場合は、エラーが報告されます。

OPTIMIZE TABLEALTER TABLE table name ENGINE=INNODBどちらもOline DDLをサポートしていますが、業務アクセス量が少ない場合には、これらを使用することをお勧めします。

5. まとめ

データdelete場合、対応するデータ行は実際には削除されず、単に再利用可能としてマークされるだけなので、表スペースは小さくなりません。

データdelete後、テーブルを再構築してテーブルのサイズをすばやく縮小することができます ( OPTIMIZE TABLEまたはALTER TABLE )。バージョン 5.6 以降では、テーブル作成でOnline操作がサポートされていますが、ビジネスのピーク時以外は使用することをお勧めします。

MySQL テーブルデータを削除した後もディスク領域が占有される理由については、これでこの記事は終了です。MySQL MySQLデータ削除の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 入門 (IV) テーブルへのデータの挿入、更新、削除
  • MySQL データ挿入最適化メソッドconcurrent_insert
  • MySQL データ挿入効率の比較
  • MySQL は、あるテーブルのデータに基づいて別のテーブルの特定のフィールドを更新します (SQL ステートメント)
  • バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明
  • MySQLデータの挿入、更新、削除の詳細

<<:  Dockerでデータディレクトリを移行する方法

>>:  CSS属性のデフォルト値width: autoとwidth: 100%の違いの詳細な説明

推薦する

MySQL カーソル関数と使用法

目次意味カーソルの役割カーソルの使用カーソルの宣言カーソルを開くカーソルデータのトラバースカーソルを...

CSS 透明ボーダー背景クリップマジック

この記事では、CSSの透明な境界線の背景クリップの素晴らしい使い方を主に紹介し、みんなと共有し、自分...

Linux での UDP について学ぶ

目次1. UDPとLinuxの基礎の紹介2. 各機能の使い方1. ソケット機能の使用2. バインド機...

Docker ファイルの保存パス、コンテナの起動コマンド操作の取得

コンテナはすでに作成されていますが、その起動パラメータ(データがマウントされる場所)を知る方法 #コ...

Vueベースのカスタムコンポーネントを実装してアイコンを導入する

序文プロジェクト開発では、アイコンを使用する方法はたくさんあります。iconfont で適切なアイコ...

単一/複数行テキストを含む div を垂直方向に中央揃えする N 通りの方法 (高さ不明/高さ固定)

この問題について話すとき、垂直方向の中央揃えを設定するための vertical-align 属性が ...

DockerはホストのMysql操作に接続します

今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...

鏡像効果を実現する JavaScript キャンバス

この記事では、JavaScriptキャンバスでミラーイメージ効果を実現するための具体的なコードを参考...

CenOS6.7 mysql 8.0.22 のインストールと設定方法のグラフィックチュートリアル

CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...

JavaScript はチェックボックスの選択機能を実装します

この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...

DeepinでPyenvをインストールする手順

序文これまでは、/bin/ ディレクトリのソフトリンクを変更して Python のバージョンを切り替...

React のグローバル状態管理の 3 つの基本メカニズムの調査

目次序文小道具コンテクスト州要約する序文最新のフロントエンド フレームワークはすべて、コンポーネント...

Windows 10 Home Edition に Docker for Windows をインストールする

0. 背景ハードウェア: Xiaomi Notebook Air 13/Inter Core i7-...

Nginx操作応答ヘッダー情報の実装

前提条件: ヘッダー情報操作をサポートするには、ngx_http_headers_module モジ...

システム エラー 1067 のため、MySQL 5.6 解凍バージョン サービスを開始できません

今日午後ずっと私を悩ませたバグを記録する半月前から始めましょう。それから.................