MySQL テーブルスペースの断片化の概念と関連する問題の解決策

MySQL テーブルスペースの断片化の概念と関連する問題の解決策

背景

MySQL を頻繁に使用すると、MySQL データ ファイルのディスク容量が一般的に増加し続け、データを削除したり、データのバッチを挿入したりしても、ディスク容量が変更されないことがあります。この奇妙な現象の原因は、MySQL テーブル スペースの断片化です。

表領域の断片化とは何ですか?

表領域の断片化とは、表領域内に断片が存在することを意味します。よりわかりやすい比喩を使うと、これは A4 用紙のようなものです。「表領域の断片化」とは、この A4 用紙を細かく裂いてから、再びまとめるようなものです。断片の間には隙間ができ、この隙間が「表領域の断片」です。再構成された断片は、実際には完全な A4 用紙よりも 1 サイズ大きくなり、テーブル スペースによって簡単に引き起こされる問題、つまり無駄なスペースも表します。

背景で説明した現象は、図で説明できます。

図中の数字は実際のデータ行を表し、角丸四角形はテーブルの表スペースを表します。左から右へ、最初の操作はデータを削除することです。MySQL はスペースを積極的に解放しないように設計されているため、テーブル内のデータ行が削除されると、データは「削除」されますが、この部分のスペースは実際には解放されず、テーブル A によって引き続き占有されます。そのため、ログ テーブル内の大量のデータが削除されても、MySQL のディスク スペースは削減されないというシナリオが発生します。

PS: スペースを解放しないこの設計は、主に遅延削除に関連しています。初期のデータベースの設計では、使用されていた IO デバイスは一般に機械式ディスクであり、その読み取りおよび書き込みパフォーマンスは SSD よりもはるかに劣っていたため、削除操作によってディスク上のデータが直接削除されることはほとんどありませんでした。

データが削除された後、元々連続していたスペースに 2 つの空白領域が出現していることがわかります。これは一般にテーブルスペース ホールと呼ばれます。ホールが多すぎる場合は、テーブルスペースの断片化 (対応するテーブルスペースが連続している) と呼ばれます。この部分のスペースは解放されませんが、再利用可能としてマークされます。右端のテーブルスペース図 (3 番目の角丸四角形) を参照してください。新しいデータが挿入されると、新しいデータはテーブルスペースの穴に再度書き込まれます。これは、大規模なデータ削除されたテーブルにデータを書き込むときに、テーブルスペースが大幅に増加しないか、まったく増加しない可能性があることも意味します。

実際、テーブルスペースの穴を引き起こす可能性がある操作は削除だけではありません。更新もこの問題を引き起こす可能性があります。たとえば、varchar などの可変長文字列のデータを変更する場合、列が短くなると非常に小さな穴が発生します。列が長くなると、スペース不足のためにデータ行の一部のデータが他の場所に移動される可能性があります。

表領域の断片化を確認する方法

MySQL のシステム テーブルにはテーブルスペースの使用状況が記録されます。これは次のクエリで確認できます。

SELECT CONCAT(テーブルスキーマ,'.',テーブル名) AS 'テーブル名',
                table_rows AS '行数'、
                CONCAT(ROUND(データ長/(1024*1024),2),'M') AS 'データサイズ',
                CONCAT(ROUND(インデックス長/(1024*1024),2),'M') AS 'インデックスサイズ',
                CONCAT(ROUND(データフリー/(1024*1024),2),'M') AS'データフリー',
                CONCAT(ROUND(データ空き容量/データ長,2),'%') AS 'データ空き容量',
                ENGINE を「エンジン」として
information_schema.TABLES から
ここで、table_schema = 'テーブル名' 
data_free desc で ORDER します。

data_free はテーブルスペースの断片化の合計スペースサイズを指し、data_free_pct はこのテーブルの断片化の割合を指します。効果は次のとおりです。

mysql> SELECT CONCAT(table_schema,'.',table_name) AS 'table_name',
    -> table_rows AS '行数'、
    -> CONCAT(ROUND(データ長/(1024*1024),2),' M') AS 'データサイズ',
    -> CONCAT(ROUND(インデックス長/(1024*1024),2),' M') AS 'インデックスサイズ',
    -> CONCAT(ROUND(data_free/(1024*1024),2),' M') AS'data_free',
    -> CONCAT(ROUND(データ空き容量/データ長,2),' %') AS 'データ空き容量',
    -> ENGINE を 'engine' として
    -> information_schema.TABLES から
    -> WHERE table_schema = 'sbtest'
    -> data_free desc で ORDER します。
+----------------+----------------+-----------+------------+-----------+---------------+---------+
| table_name | 行数 | data_size | index_size | data_free | data_free_pct | engine |
+----------------+----------------+-----------+------------+-----------+---------------+---------+
| sbtest.sbtest5 | 0 | 0.02 M | 0.00 M | 44.00 M | 2816.00 % | InnoDB |
| sbtest.sbtest4 | 986400 | 214.70 M | 15.52 M | 4.00 M | 0.02 % | InnoDB |
| sbtest.sbtest3 | 986400 | 214.70 M | 15.52 M | 4.00 M | 0.02 % | InnoDB |
| sbtest.sbtest2 | 986400 | 214.70 M | 15.52 M | 4.00 M | 0.02 % | InnoDB |
| sbtest.sbtest1 | 987400 | 199.70 M | 15.52 M | 4.00 M | 0.02 % | InnoDB |
+----------------+----------------+-----------+------------+-----------+---------------+---------+
セット内の行数は 5 です (0.00 秒)

最初のデータ行はテストに使用されます。テーブル内のすべてのデータが削除されているため、計算された data_free_pct は 100% を超えています。

表スペースの断片化問題を解決する方法

現在、テーブル スペースを再利用する方法は 1 つしかなく、最適化、テーブルの変更などを含む、テーブルの再構築です。一部の alter table 操作は、テーブルを再構築することによってのみ完了できます。そのため、大規模なテーブルでメンテナンス操作を実行した後、ディスク領域の使用量が減少することがあります。これは、テーブル領域のフラグメントによって解放された領域が再利用されたためです。

一般的な経験から、テーブル スペースの断片化回復操作を頻繁に実行することは推奨されません。テーブルの再構築はサーバー リソースに大きな影響を与え、このテーブルの書き込み操作に影響を与えるため、月に 1 回で十分です。ディスク容量が非常に少なく、ログが基本的にクリアされていない限り、断片化率 (data_free_pct) が 20% 未満であれば、あまり心配する必要はありません。

スペースの再利用の問題について

一部のログ テーブルや地域特性を持つテーブルについては、MySQL パーティション テーブルを使用して管理することをお勧めします。 データのバッチをクリーンアップする必要がある場合は、パーティション切り捨てを使用してクリーンアップし、ディスク領域を直接解放できます。

上記は、MySQL テーブル スペースの断片化の概念と関連する問題の解決方法の詳細な内容です。MySQL テーブル スペースの断片化の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL でテーブルスペースの断片化を解消する詳細な例
  • MySQLテーブルの断片化の原因とクリーンアップを分析する
  • MySQL テーブルの断片化を解消し、スペースを再利用する方法

<<:  個人的な意見: デザインについて語る

>>:  入力ボックスのプレースホルダーアニメーションと入力検証を実現する純粋なCSS

推薦する

LinuxカーネルマクロContainer_Ofの詳細な説明

目次1. 構造体はメモリにどのように保存されますか? 2. container_ofマクロ3. 型4...

MySql8.023 インストール プロセスの詳細なグラフィック説明 (初回インストール)

まず、MySQL公式サイトからインストールパッケージをダウンロードします。MySQLはオープンソース...

VMware Workstation 仮想マシンのインストール操作方法

仮想マシンは非常に便利なテストソフトウェアです。ハードウェアに損傷を与えることなく、さまざまなテスト...

MySQL SQL 最適化チュートリアル: IN クエリと RANGE クエリ

まず、in() クエリについて説明します。 「High Performance MySQL」では、イ...

Linux で binlog ファイルの作成時間を表示するコマンド

目次背景分析する方法背景MySQL は 26 日の 16:23:49 に大量のスロー クエリを生成し...

MySQL の遅いクエリ操作の例の分析 [有効化、テスト、確認など]

この記事では、MySQL のスロー クエリ操作について例を挙げて説明します。ご参考までに、詳細は以下...

WeChatアプレットはシンプルな手書き署名コンポーネントを実装します

目次背景:必要:効果1. アイデア2. 実装1. ページとスタイル2. 初期化3. クリックすると4...

さまざまなReact状態マネージャーの解釈と使用方法

まず、状態マネージャーとは何か、そしてそれが何をするのかを知る必要があります。複数のページで同じプロ...

div が iframe に覆われるいくつかの状況とその解決策

類似の構造:コードをコピーコードは次のとおりです。 <div></div>&...

データベース内のSQL整合性制約ステートメントの分析

整合性制約整合性制約はテーブル データの正確性を保つためのものです。データが正しくない場合は、そもそ...

入力タイプとは何を意味し、入力を制限する方法

入力を制限する一般的な方法1. ボタンが押されたときに点線のボックスを消すには、入力に属性値hide...

Linux の MariaDB データベースについて

目次Linux の MariaDB データベースについて1. データベースとは何ですか? 2. デー...

TypeScript における型保護の詳細な説明

目次概要型アサーション構文ではインスタンスオブ構文typeof構文要約する概要TypeScript ...

珍しいけれど役に立つJSテクニックをいくつか紹介します

序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...

Docker可視化ツールPortainerの導入と中国語翻訳

#docker 検索#docker プルポーター1. イメージを取得した後、中国語パッケージをダウン...