背景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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: 入力ボックスのプレースホルダーアニメーションと入力検証を実現する純粋なCSS
目次1. 事前準備1.1 Node.jsをインストールする1.2 webpackをインストールする1...
Dockerは複数のSpringbootを実行する1番目: ポートマッピング 2番目: メモリサイズ...
VIP を設定した後、アクティブ/スタンバイの切り替え中に表示されるエラー メッセージは次のとおりで...
目次概要node.js でマルチコア CPU を最大限に活用する方法Node で子プロセスを作成する...
1. なぜこの記事を書くのですか?重複リクエストの処理に関する記事をたくさん読んだことがあるでしょう...
日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...
目次概要関数シグネチャオプションパラメータ非厳密モード例外処理実用要約する概要ご存知のとおり、ES6...
説明する: Tabs コンポーネントが切り替わると、TabPane に含まれる同じサブコンポーネント...
CSS では、要素タグは、要素の表示モードの違いに応じて、インラインレベル要素とブロックレベル要素の...
なぜこれを使ったのか?それはポスターを作ることから始まりました。それは嵐の夜でした。 。 。さて、無...
目次1. プロジェクトの構築2. Vue3 体験 + Vant 紹介2020年9月18日にvue.j...
序文: Vueプロジェクトで透かし効果を使用するには、コンテナを指定できます効果画像: 1. コンテ...
この記事では、Jiugonggeモバイルパズルゲームを実装するためのJavaScriptの具体的なコ...
目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...
序文データベースの応用において、プログラマーは継続的な実践を通じて多くの経験を積んできました。これら...