MySQL でストリーミングクエリを使用してデータ OOM を回避する

MySQL でストリーミングクエリを使用してデータ OOM を回避する

1. はじめに

プログラムがMySQLデータベースにアクセスするときに、クエリされるデータの量が特に大きい場合、データベース ドライバーは読み込まれたすべてのデータをメモリにロードし、メモリ オーバーフロー (OOM) が発生する可能性があります。

実際、 MySQLデータベースはストリーミング クエリを提供しており、これにより、修飾されたデータをバッチでメモリにロードできるため、OOM を効果的に回避できます。この記事では、主にストリーミング クエリの使用方法を紹介し、パフォーマンス テストで通常のクエリと比較します。

2. JDBCはストリーミングクエリを実装する

ストリーミング クエリは、JDBC のPreparedStatement/StatementsetFetchSizeメソッドをInteger.MIN_VALUEに設定するか、 Statement.enableStreamingResults()メソッドを使用することで実装できます。ResultSet.next ResultSet.next()メソッドが実行されると、データベース接続を通じて 1 つずつ返されるため、大量のクライアント メモリを占有することはありません。

パブリック int execute(String sql, boolean isStreamQuery) は SQLException をスローします {
 接続 conn = null;
 PreparedStatement stmt = null;
 結果セット rs = null;
 整数カウント = 0;
 試す {
  //データベース接続を取得します。conn = getConnection();
  if (isStreamQuery) {
   //ストリーミング クエリ パラメータを設定します。stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
   stmt.setFetchSize(Integer.MIN_VALUE);
  } それ以外 {
   //通常のクエリ stmt = conn.prepareStatement(sql);
  }

  //クエリを実行して結果を取得します。rs = stmt.executeQuery();
  // 結果を走査します while (rs.next ()) {
   System.out.println(rs.getString(1));
   カウント++;
  }
 } キャッチ (SQLException e) {
  e.printStackTrace();
 ついに
  閉じる(stmt、rs、conn);
 }
 カウントを返します。
}

「PS」: 上記の例では、パラメーターisStreamQuery使用して、次のテスト比較で「ストリーミング クエリ」「通常のクエリ」を切り替えます。

3. パフォーマンステスト

テスト用にテストテーブルmy_testが作成されます。データの総量は27wです。テストには次の 4 つのテストケースが使用されます。

  • 大容量データ一般クエリ(270,000件)
  • 大容量データストリーミングクエリ(270,000レコード)
  • 小容量データ一般クエリ(10件)
  • 小容量データストリーミングクエリ(10項目)

3.1. 大容量データの一般クエリをテストする

@テスト
パブリック void testCommonBigData() は SQLException をスローします {
 文字列 sql = "select * from my_test";
 テスト実行(sql, false);
}

3.1.1. クエリ時間

27wのデータ量は38秒かかります

3.1.2. メモリ使用量

約1Gのメモリを使用

3.2. 大容量データストリーミングクエリのテスト

@テスト
パブリック void testStreamBigData() は SQLException をスローします {
 文字列 sql = "select * from my_test";
 テストを実行します(sql, true);
}

3.2.1. クエリ時間

27wのデータ量は37秒かかります

3.2.2. メモリ使用量

バッチで取得されるため、メモリは30〜270mの間で変動します。

3.3. 少量データに対する通常のクエリのテスト

@テスト
パブリック void testCommonSmallData() は SQLException をスローします {
 文字列 sql = "select * from my_test limit 100000, 10";
 テスト実行(sql, false);
}

3.3.1. クエリ時間

10個のデータには1秒かかります

3.4. 少量のデータでストリーミングクエリをテストする

@テスト
パブリック void testStreamSmallData() は SQLException をスローします {
 文字列 sql = "select * from my_test limit 100000, 10";
 テストを実行します(sql, true);
}

3.4.1. クエリ時間

10個のデータには1秒かかります

IV. 結論

MySQL ストリーミング クエリはメモリ使用量に明らかな最適化効果をもたらしますが、クエリ速度にはほとんど影響しません。主に、大量のデータをクエリするときにメモリ使用量が高くなるシナリオを解決するために使用されます。

「デモアドレス」: https://github.com/zlt2000/mysql-stream-query

これで、MySQL でストリーミング クエリを使用してデータ OOM を回避する方法に関するこの記事は終了です。MySQL ストリーミング クエリに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL OOM (メモリオーバーフロー) の解決策
  • MySQL スレーブが oom-killer をトリガーする問題の解決方法
  • MySQL OOM シリーズ 3: MySQL が殺されるという不運から逃れる
  • MySQL OOM システム 2 OOM キラー
  • MySQL OOM シリーズ 1 Linux メモリ割り当て

<<:  Docker環境を構築する簡単な方法

>>:  ログインボックスのメールプロンプトを実装するネイティブJS

推薦する

Linux リモートログイン実装チュートリアル分析

Linux は一般的にサーバーとして使用され、サーバーは一般的にコンピュータルーム内に置かれます。L...

VMware15 centos7 ブリッジモード ssh に突然アクセスできなくなる問題を解決する

仮想マシンに独自の LAN IP を持たせたいので、テストを容易にするためにブリッジを使用します。 ...

Navicat を使用してリモート Linux MySQL データベースに接続するときに発生する 10061 不明エラーの詳細な説明

Navicat を使用してリモート Linux MySQL データベースに接続すると、不明なエラー ...

HTML 選択ボックスのプレースホルダーの作成に関する問題

テキスト入力でプレースホルダーを使用していますが、問題なく動作します。しかし、選択ボックスにはプレー...

MySQL 5.7.18 zip バージョンのインストールと設定方法のグラフィック チュートリアル (win7)

Windows に mysql5.7.18zip バージョンをインストールするには、使用前に解凍し...

露滴アニメーション効果を実装するための Three.js サンプル コード

序文みなさんこんにちは。CSS ウィザードの alphardex です。この記事では、three.j...

MySQLテーブルのフィールドと関連属性をエクスポートする手順

データベース内のテーブルのフィールドとプロパティをエクスポートし、テーブルを作成してWordに保存す...

CCS におけるマージン: トップ崩壊問題を解決する

HTML 構造は次のとおりです。 CCS 構造は次のとおりです。 ページ効果図は次のとおりです。 こ...

CentOS 8 システム FTP サーバーのインストールとパッシブ モードの設定の詳細なチュートリアル

目次1. 基本を理解する2. システム環境を確認する3. ftpコマンドをインストールする[オプショ...

Docker で MySQL を起動したときに SQL 文を自動的に実行する方法

Docker で MySQL コンテナを作成する場合、コンテナの起動後にデータベースとテーブルが自動...

フロントエンドJavaScriptは関数のカリー化を完全に理解している

目次1. カレーとは何か2. カレーの用途3. カリー化ユーティリティ関数をカプセル化する方法 1....

docker-swarm をベースにした継続的インテグレーション クラスタ サービスの構築の詳細な説明

序文この記事は私自身の製作過程の簡単な記録です。練習中に質問があれば、一緒に話し合うことができます。...

Mybatisの各SQL文の実行時間の統計

背景最近、面接でデータベース トランザクションについてよく質問されます。通常は、@Transacti...

HTML と JavaScript を使用してローカル メディア (ビデオとオーディオ) ファイルを再生する方法

まず、セキュリティ上の理由から、JavaScript はローカル リソース ファイルに直接アクセスで...

MySQL DDL による同期遅延を解決する方法

目次序文解決ツールの紹介仕組み使用制限使用上の注意使用例いくつかのパラメータの説明出力例Tencen...