パーティショニングを使用して数十億のデータに対する MySQL データ処理を最適化する方法

パーティショニングを使用して数十億のデータに対する MySQL データ処理を最適化する方法

MySQL が数千万のデータをクエリする場合、ほとんどのクエリ最適化の問題はインデックスを通じて解決できます。しかし、何億ものデータを扱う場合、インデックスはあまり使いやすくありません。

データ テーブル (ログ) は次のようになります。

  • テーブルサイズ: 1T、約 24 億行。
  • テーブルのパーティション分割: 時間ごとにパーティション分割し、各月を 1 つのパーティションとし、1 つのパーティションには約 2 億~ 3 億行のデータ (約 40~70 GB) が含まれます。

データ全体を処理する必要はなかったため、需要側と協議の上、1か月分の約3億5千万行のデータをサンプリングするなど、期間ごとにデータの一部をサンプリングしました。
データ処理のアイデア:

1) テーブルエンジンとして Innodb を選択します。データは月ごとにパーティション化されているため、月ごとのパーティションのデータを個別にコピーします。ソース テーブルは MyISAM エンジンです。一部のデータをフィルターする必要がある場合があり、フィルターに関係するフィールドにはインデックスがないため、MyISAM エンジンを使用してインデックスを追加する速度は遅くなります。
2) 日ごとに区切る。コピーしたテーブルにインデックスを追加した後 (約 2 ~ 4 時間)、不要なデータを除外し、新しいテーブルを再度生成し、JSON で必要なフィールドを抽出し、テーブルを日ごとに分割します。

テーブル `tb_name` を作成します (
  `id_`、
  ...、
  キー `idx_1` (`create_user_`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='アプリケーション ログ'
範囲によるパーティション分割(to_days(log_time_)) (
    パーティション p1231 の値は (737425) 未満です。
    パーティション p0101 の値は (737426) 未満です。
    パーティション p0102 の値は (737427) 未満です。
    パーティション p0103 の値は (737428) 未満です。
    パーティション p0104 の値は (737429) 未満です。
......
);

3) 上記で生成したテーブルに対して日次集計などの操作を実行し、その結果を一時テーブルに保存します。ストアド プロシージャを使用してデータを処理します。処理は比較的複雑で時間がかかるため (ストアド プロシージャの実行には約 1 ~ 2 時間かかります)、ストアド プロシージャを周期的に呼び出す場合は、実行プロセス中の操作時間とパラメータを記録する必要があります。

区切り文字 $$
プロシージャ proc_name(param varchar(50)) を作成します。
始める
 start_date 日付を宣言します。
    end_date 日付を宣言します。
    start_date を '2018-12-31' に設定します。
    end_date を '2019-02-01' に設定します。
    
    トランザクションを開始します。
 tmp_talbeを切り捨てます。
 専念;
    
    開始日 < 終了日の場合
  @partition_name = date_format(start_date, '%m%d') を設定します。
        set @start_time = now(); -- 現在のパーティション操作開始トランザクションの開始時刻を記録します。
  @sqlstr = concat( を設定します。
   「tmp_talbe に挿入」、
   "フィールド名を選択"、
            "tb_name パーティション(p", @partition_name,) t から ",
            「条件」
   );
  -- @sqlstr を選択します。
  @sqlstr から stmt を準備します。  
  ステートメントを実行します。
  準備ステートメントの割り当てを解除します。
  専念;
        
        -- ログ セットを挿入 @finish_time = now(); -- 操作終了時刻を oprerate_log に挿入 values(param、@partition_name、@start_time、@finish_time、timestampdiff(second、@start_time、@finish_time));
        
  start_date = date_add(start_date、間隔 1 日) を設定します。
    終了しながら;
終わり
$$
区切り文字 ;

4) 上記で生成された結果を並べ替えて処理します。

一般的に、処理は比較的面倒で、多くの中間テーブルが生成されます。重要なステップでは、操作プロセスのメタデータも記録する必要があり、SQL 処理に高い負荷がかかります。したがって、このタスクの処理に MySQL を使用することはお勧めしません (絶対に必要な場合を除く)。処理をビッグデータ プラットフォームに配置できれば、速度が速くなり、メタデータ管理も比較的専門的になります。

パーティションを使用して MySQL の 10 億レベルのデータ最適化を処理する方法については、これで終わりです。MySQL の 10 億レベルのデータ最適化に関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データ挿入最適化メソッドconcurrent_insert
  • MySQL 最適化 query_cache_limit パラメータの説明
  • 数百万のデータに対して MySQL クエリを最適化する 4 つの方法
  • MySQL の最適化: 高品質の SQL 文を書く方法
  • MySQLを素早く最適化する

<<:  js が CSS 属性 (値) のサポートを決定して通知する状況の分析

>>:  Unicode署名BOMによる事故原因の分析

推薦する

VMware 仮想マシンの 3 つのネットワーク方式と原則 (概要)

1. ブリッジ: デフォルトでは VMnet0 が使用されます1. 原則:ブリッジは、それぞれ 2...

CSSメディアクエリのアスペクト比を小さくする方法

CSS メディア クエリには非常に便利なアスペクト比、aspect-ratio があり、幅と高さを直...

CSSはクーポンスタイルを実装するために放射状グラデーションを使用します

この記事では、CSS で放射状グラデーションを使用して、次の図に示すクーポン スタイルの効果を実現す...

Linux で特殊文字のファイル名やディレクトリを削除する方法

inode番号でファイルを削除するまずls -iを使用して、削除するファイルのinode番号を見つけ...

Vue はボタンをクリックしてファイルをダウンロードする操作コードを実装します (バックエンド Java)

前回の記事では、ボタンをクリックしてファイルをダウンロードするVueの機能を紹介しました。今日は、ボ...

配列をフィルタリングするJavaScript

この記事では、配列フィルタリングを実装するためのJavaScriptの具体的なコードを参考までに紹介...

MySQL スロークエリ: スロークエリを有効にする

1. スロークエリの用途は何ですか? long_query_time を超えて実行されるすべての S...

ElementUIカスタムCSSスタイルが有効にならない問題を解決する

例えば、入力ボックスがあります <el-入力 ref="mySearch"...

Reactのコンテキストとプロパティの説明

目次1. 文脈1. 使用シナリオ2. 使用手順3. 結論2. 小道具の詳細1. 子供の財産2. 小道...

別の種類の「キャンセル」ボタン

「キャンセル」ボタンは必要な操作プロセスの一部ではなく、デザイン上の主要な要素として表示されません...

MySQL 8.0.15 winx64 のインストールと設定方法のグラフィックチュートリアル (Windows の場合)

この記事では、MySQL 8.0.15 winx64のインストールと設定方法を参考までに紹介します。...

Linux7 ベースの Hadoop のインストールと構成の詳細なグラフィック説明

上記のように材料を準備します(ps: hadoop-3.1.2-srcはhadoop-3.1.2に変...

ウェブページの背景色を制御する CSS コード

誰もが自分の Web ページの背景にふさわしい画像を見つけることに悩むことが多いと思います。これは事...

Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します

序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...

MySQL 構成マスタースレーブサーバー (マスター 1 台とスレーブ複数台)

目次アイデアホスト構成confを変更する再起動テストスレーブ 1 の構成スレーブ2の構成マスターとス...