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

推薦する

Vueライフサイクルカメラの8つのフック関数

目次1. beforeCreateとcreated関数2. beforeMountとmount関数3...

CSS が初期読み込み時の白い画面の時間に与える影響

外部 CSS ファイルを使用したレンダリング パイプライン上図では、HTML データの要求から DO...

サーバーストレステストの概念と方法 (TPS/同時実行性)

目次1 ストレステストの指標1.1 秒あたり1.2 クォータ1.3 平均処理時間(RT) 1.4 同...

同じ IP のアクセス頻度を制限するように nginx を設定する方法

1. nginx.conf の http{} に次のコードを追加します。 limit_conn_zo...

Vueは、センシティブな単語フィルタリングコンポーネントを検出するためのさまざまなアイデアを実装しています。

目次前面に書かれた要件分析 v1アイデア1: インターセプションメソッドを使用して入力ボックスの入力...

ウェブデザインのためのロイヤルブルーのカラーマッチング入門

古典的な色の組み合わせは力と権威を伝え、強いロイヤルブルーはあらゆる古典的な色の組み合わせの中心的な...

mysqlreplicate を使って MySQL マスタースレーブを素早く構築する方法

導入mysql-utilities ツールセットは、DBA のツールボックスとも言えるさまざまなツー...

JS WebSocketを使用して簡単なチャットを実装する方法

目次ショートポーリングロングポーリングウェブソケットコミュニケーションの原則シンプルな1対1チャット...

CentOS 8 VMware 仮想マシンがインターネットにアクセスするための静的 IP ネットワーク カードの設定の詳細な説明

最初のステップ: VMwareで、「編集」-「仮想ネットワークエディタ」をクリックします。下図に示す...

MYSQL ログとバックアップおよび復元の問題の詳細な説明

この記事では、参考までにMYSQLログとバックアップとリストアについて紹介します。具体的な内容は以下...

Vueを使用してタイマー機能を実装する

この記事の例では、タイマー機能を実装するためのVueの具体的なコードを参考までに共有しています。具体...

HTML/CSSにおける記号論の詳細な説明

この記事では、ソシュールの言語哲学などの理論に基づいて、CSS の class 属性は不要であると主...

Vue ルーターにパラメータを渡すときにページを更新するとパラメータが失われる問題に対処する方法

目次概要方法1: params経由でパラメータを渡す方法2: クエリを通じてパラメータを渡す方法3:...

Apache ab同時負荷ストレステストの実装方法

腹筋コマンドの原則Apache の ab コマンドは、マルチスレッドの同時リクエストをシミュレートし...

mysql-8.0.16 winx64 最新インストール チュートリアル (画像とテキスト付き)

最近、データベースについて学び始めました。最初にやったことは、データベースとは何か、データベースとデ...