MySQL でテーブルスペースの断片化を解消する詳細な例

MySQL でテーブルスペースの断片化を解消する詳細な例

MySQL でテーブルスペースの断片化を解消する詳細な例

断片化の原因

(1)テーブルのストレージは断片化されます。行が削除されるたびに、スペースが空になり、空のままになります。一定期間にわたって多数の削除操作が行われると、空のスペースがテーブルの内容を格納するために使用されるスペースよりも大きくなります。

(2)挿入操作を実行する場合、MySQLは空き領域を使用しようとします。ただし、空き領域が適切なサイズのデータ​​で占有されていない場合、空き領域を完全に占有することができず、断片化が発生します。

(3)MySQLがデータをスキャンする際、実際にはテーブルの容量要件の上限、つまりデータが書き込まれる領域のピーク部分をスキャンします。

例えば:

テーブルには 10,000 行あり、各行は 10 バイトで、100,000 バイトのストレージ スペースを占有します。削除操作を実行すると、1 行のみが残り、実際のコンテンツは 10 バイトのみになります。ただし、MySQL がそれを読み取ると、100,000 バイトのテーブルとして扱われます。したがって、フラグメントの数が多いほど、クエリのパフォーマンスに影響します。

テーブルフラグメントのサイズを確認する

(1)テーブルのフラグメントサイズを確認する

mysql> SHOW TABLE STATUS LIKE 'テーブル名';

結果の「Data_free」列の値はフラグメントサイズです。

(2)断片化されたテーブルを全てリストする

mysql> table_schema db、table_name、data_free、engine を選択   
information_schema.tables から 
table_schema が ('information_schema', 'mysql') に含まれず、data_free > 0 の場合;

テーブルの断片化を解消

(1)MyISAMテーブル

mysql> テーブルテーブル名を最適化する

(2)InnoDBテーブル

mysql> テーブル名を変更する エンジン = InnoDB

OPTIMIZE の動作はエンジンによって異なります。MyISAM はインデックスとデータが分離されているため、OPTIMIZE はデータ ファイルをソートし、インデックスを再配置することができます。

OPTIMIZE 操作はテーブルを一時的にロックし、データ量が多いほど時間がかかります。結局のところ、単純なクエリ操作ではありません。したがって、プログラムに Optimize コマンドを配置するのは適切ではありません。ヒット率をどれだけ低く設定しても、アクセス回数が増えると、全体のヒット率も増加し、プログラムの実行効率に大きな影響を与えることは間違いありません。より良い方法は、シェルを作成し、mysql のinformation_schema.TABLESフィールドを定期的にチェックし、DATA_FREE フィールドをチェックすることです。0 より大きい場合は、断片化があることを意味します。

提案

クリア操作により、テーブルが一時的にロックされます。データ量が多いほど、時間がかかります。スクリプトを作成し、アクセスが少ない時間帯に定期的に実行することができます。たとえば、毎週水曜日の夜明けに DATA_FREE フィールドを確認します。想定される警告値より大きい場合は、一度クリーンアップします。

ご質問がありましたら、メッセージを残すか、コミュニティに参加して話し合いましょう。お読みいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。

以下もご興味があるかもしれません:
  • MySQL テーブルスペースの断片化の概念と関連する問題の解決策
  • MySQLテーブルの断片化の原因とクリーンアップを分析する
  • MySQL テーブルの断片化を解消し、スペースを再利用する方法

<<:  クリックナンバーゲームを実装するネイティブJS

>>:  ReactプロジェクトにSCSSを導入する方法

推薦する

docker createコマンドの使用方法

docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...

RHEL7.5 mysql 8.0.11 インストールチュートリアル

この記事はRHEL7.5でのMySQL 8.0.11のインストールチュートリアルを記録しています。具...

MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

% ワイルドカードを使用すると、インデックス失敗の問題が発生することがよくあります。ここでは、lik...

MySQL デッドロック ルーチン: 一意のインデックスの下でのバッチ挿入順序の不一致

序文デッドロックの本質はリソースの競合です。バッチ挿入の順序が一貫していないと、デッドロックに陥りや...

HTML(divレイヤー)を介してFLASHにリンクを追加するための実装コード

今日、クライアントが広告を掲載したいのですが、提供された素材は Flash です。私たちはあまり気に...

JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法

目次1. 自己列挙可能なプロパティ2. Object.values()はプロパティ値を返します3. ...

Vueはシンプルなタイマーコンポーネントを実装します

プロジェクトを実行すると、リアルタイム更新、広告アニメーションの連続表示などの要件に遭遇することは避...

Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード

1. 基本的な Spring-boot クイックスタート1.1 クイックスタート pom.xml は...

cocoscreatorプレハブの詳しい説明

目次プレハブプレハブの作り方プレハブの役割1. 同じタイプのノードをバッチで作成する2. 特定の時間...

フローティングメニュー、上下スクロール効果を実現できます

コードはさらに合理化できますが、時間の制約があるため、まずはここで投稿して、自分で最適化してメニュー...

VSCode 構成 Git メソッドの手順

Git は vscode に統合されており、git コマンドをいくつか記述しなくても、クリックするだ...

Vue+js はビデオのフェードインとフェードアウト効果を実現します

Vue+jsはビデオのフェードインとフェードアウトを実現します。参考までに、具体的な内容は次のとおり...

MySQL の FIND_IN_SET() と IN の違いを簡単に分析します

以前、あるプロジェクトでMysql FIND_IN_SET関数を使用したことがありますが、非常に便利...

Linux での vi (vim) の新しい使い方のまとめ

私は数年間 vi エディタを使ってきましたが、実用的な用途で使ったことはありませんでした。今日 Py...