時間が経過したり、業務量が増えたりすると、データベースのスペース使用率は着実に上昇し続けます。データベースのスペースがボトルネックになりそうになると、データベースに 1 つまたは 2 つの非常に大きなテーブルがあることに気付くことがあります。事業開始から現在までのあらゆるデータが蓄積されているが、その90%はビジネス価値のないデータだ。このような膨大なテーブルを、いったいどう扱えばいいのだろうか。 価値のないデータなので、通常は直接削除するか、アーカイブしてから削除するかを選択します。データ削除の操作方法は、次の 2 つのカテゴリに分けられます。
1. 切り捨て操作論理的に言えば、切り捨て操作はテーブル内のすべての行を削除しますが、delete from table_name where 1=1 操作とは異なります。テーブルデータ全体を削除するパフォーマンスを向上させるために、MySQL の切り捨て操作では、実際には最初にテーブルを削除してからテーブルを再作成します。このため、切り捨て操作は非ロールバック DDL 操作になります。 1.1 MySQL truncate はどのような操作を実行しますか?
1.2 切り捨て操作によって発生するリソース消費を最適化するにはどうすればよいでしょうか?
2. 削除操作2.1 MySQL の delete はどのような操作を実行しますか?
2.2 削除操作を最適化するにはどうすればよいでしょうか?
2.3 削除の一般的な2つのシナリオ2.3.1 条件に有効なインデックスフィルタリングがない場合は削除する よくあるシナリオは、ビジネスで t1 condition1=xxx の値を削除する必要があることです。条件フィールドはインデックスを効果的に使用できません。この場合、通常は次の操作を行います。
-- 自己増分主キー インデックスを使用して、condition1=xxx かつ id >=1 かつ id < 50000 の t1 から削除します。 condition1=xxx かつ id >=50000 かつ id < 100000 の場合、t1 から削除します。 -- 時間インデックスを使用して、condition1=xxx かつ create_time >= '2021-01-01 00:00:00' かつ create_time < '2021-02-01 00:00:00' の場合、t1 から削除します。 condition1=xxx かつ create_time >= '2021-02-01 00:00:00' かつ create_time < '2021-03-01 00:00:00' の場合、t1 から削除します。 2.3.2 最近のデータを保存し、過去のデータを削除する よくあるシナリオとしては、過去 3 か月間の t1 テーブルのデータのみを保持し、残りの履歴データを削除する必要がある場合があります。通常のアプローチは次のとおりです。 保持する必要があるデータを一時的に保存するためのt1_tmpテーブルを作成します。 t1 のようなテーブル t1_tmp を作成します。 インデックスされた時間フィールドに従って、保持するデータをバッチで t1_tmp テーブルに書き込みます。最後のバッチの時間の操作は一時的に無視されることに注意してください。 -- インスタンスビジネスの数に応じてデータをバッチに分割し、各バッチで処理するデータが多すぎないようにします。 insert into t1_tmp select * from t1 where create_time >= '2021-01-01 00:00:00' and create_time < '2021-02-01 00:00:00'; t1_tmp に挿入し、create_time >= '2021-02-01 00:00:00' かつ create_time < '2021-03-01 00:00:00' となる t1 から * を選択します。 -- 最後のデータ バッチはまだ操作されません -- insert into t1_tmp select * from t1 where create_time >= '2021-03-01 00:00:00' and create_time < '2021-04-01 00:00:00'; 名前変更操作を使用して、現在のビジネス テーブル t1 を t1_bak テーブルに置き換え、t1_tmp テーブルを現在のビジネス テーブル名 t1 に置き換えます。削除されたテーブルに対して DML 操作が頻繁に実行される場合、この手順により、短期間のビジネス アクセス障害が発生します。 テーブル t1 の名前を t1_bak に変更します。 テーブル t1_tmp を t1 に名前変更します。 最後のデータ バッチを現在のビジネス テーブルに書き込みます。この手順の目的は、変更操作プロセス中のデータ損失を減らすことです。 t1 に挿入し、create_time >= '2021-03-01 00:00:00' かつ create_time < '2021-04-01 00:00:00' となる t1_bak から * を選択します。 名前変更操作ステップでは、変更テーブルの主キーが自己増分であるか、ビジネス固有の UUID であるかにも注意する必要があります。自己増分主キーの場合は、t1_tmp テーブルの自己増分値を変更して、最終設定値に変更期間中に書き込まれたデータが含まれるように注意する必要があります。 alter table t1_tmp auto_increment={t1テーブルの現在の自動値}+{変更期間中の推定増加値} III. 切り捨て/削除の長所と短所の比較
これで、MySQL で大きなテーブルをエレガントに削除する方法に関するこの記事は終了です。MySQL で大きなテーブルを削除する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: フレックスレイアウトの justify-content: space-between 配置のバグを解決する 2 つの方法の詳細な説明
これまでは、拡張子が .msi のファイル、つまり、完全なインストールが使用されていました。しかし、...
目次コンポーネント通信の概要コンテンツ3つの方法まとめコンポーネントコミュニケーション - 父から息...
1. 現在のホスト名を表示する [root@fangjian ~]# ホスト名ctl 静的ホスト名:...
効果コード内の画像は自分で変更できますドロップダウンメニューのHTMLコード <ヘッダークラ...
データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...
アプリケーションや Web サイトのパフォーマンスが成功の重要な要素であることは誰もが知っています。...
この問題について話すとき、垂直方向の中央揃えを設定するための vertical-align 属性が ...
前のセクションでは、コンテンツ、サーバー、JavaScript、CSS など、Web サイトのパフォ...
目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....
この記事を読む前に、Linuxコマンド、特にcentos7.3環境でyumを使用してインストールされ...
序文この記事には1. データベースのいくつかの主要な制約2. テーブル間の関係制約:主キー制約: 機...
この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...
無料のパブリック STUN サーバーSIP 端末がプライベート IP アドレスを使用する場合、スタン...
インストールまず、Java と Scala をインストールし、次に Spark をダウンロードしてイ...
1. MySQL の権限の概要MySQL には、権限を制御する 4 つのテーブルがあります。user...