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%の違いの詳細な説明

推薦する

入力ボックスのコンテンツプロンプトと非表示機能を実装する JavaScript

入力ボックスが小さい場合、内容を入力した後に、入力内容が拡大されたプロンプト ボックスを表示したいこ...

VUE 応答性原理の詳細な説明

目次1. 応答原理の基盤2. コアオブジェクト: Dep と Watcher 3. 依存関係を収集し...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

HTML テーブル マークアップ チュートリアル (41): テーブル ヘッダーの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、ヘッダーの幅と高さはコンテンツに応じて自動的に調整されます。ヘッダーの幅と高さを手動...

よくある CSS エラーと解決策

コードをコピーコードは次のとおりです。 IE6 と FF の違い: background:orang...

MySQL 8.0.17 解凍版のインストールと設定方法のグラフィックチュートリアル

インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...

MySQL サービスに iptables ファイアウォール ポリシーを追加するためのソリューション

MySQL データベースが Centos7 システムにインストールされており、オペレーティング シス...

JavaScriptプロトタイプチェーン図のまとめと実践

目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...

MySQLのデッドロックチェック処理の通常の方法

通常、デッドロックが発生すると、重みが最も小さい接続が強制終了され、ロールバックされます。ただし、最...

jsはreduceメソッドを使用してコードをよりエレガントにします

序文実際のプロジェクトでは、最も一般的な処理は計算とループロジックである可能性があります。配列でre...

CSSでサウンドを再生するいくつかのテクニック

CSS は、スタイル、レイアウト、プレゼンテーションの領域です。色彩、サイズ、アニメーションが溢れて...

nginx と keepalived を組み合わせて高可用性を実現するための手順を完了する

序文システムの高可用性を満たすためには、通常、クラスターを構築する必要があります。ホストがクラッシュ...

MySQL データベースの最適化: インデックスの実装原則と使用状況の分析

この記事では、例を使用して、MySQL データベースの最適化のためのインデックス実装の原則と使用方法...

Vue Element UI カスタム説明リストコンポーネント

この記事の例では、Vue Element UIカスタム説明リストコンポーネントの具体的なコードを参考...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...