ホームページ  >  に質問  >  本文

SQL 挿入のために複数のデータベース接続を確立することに利点はありますか?

私は大規模なデータ収集に関連するプロジェクトを書いています。 現在、.NET Framework 4.8 と Mysql パッケージを使用して接続を開始し、データベース サーバーにデータを挿入しています。

約 400,000 行/秒を挿入します。 SQL 接続がプログラムのボトルネックになるのではないかと心配しています。 SQL を使用してマルチスレッド接続を作成し、コンシューマ キューを使用してデータを挿入すると、高速化され、それだけの価値がありますか (メリットとデメリット) を知りたいです。

私の直感では、そのほうが速いと思いますが、スレッドのオーバーヘッドの点でどの程度のパフォーマンスが得られるかはわかりません。私は SQL の専門家ではないので、複数のスレッドで SQL への複数の接続を開くことの長所と短所を誰かが説明できれば幸いです。

P粉585541766P粉585541766203日前299

全員に返信(1)返信します

  • P粉373596828

    P粉3735968282024-03-31 00:42:10

    噂、意見、伝聞、事実、バージョン関連のベンチマーク、個人的な経験など...

    複数のスレッドによりスループットが向上しますが、制限があります:

    • スループットの上限は理論上の制限の約半分です。 (あなたの「パーセンテージ」) (これはマルチスレッド パッケージに基づくベンチマークです。名前は忘れました。10 年前のことです。)
    • 複数のスレッドは、ミューテックスやその他の必要なロック メカニズムに関して互いに競合します。
    • 5.7 あたりから、MySQL のマルチスレッドの制限は 64 スレッドになり、この値を超えるとスループットが停滞するか、さらには低下します。 (出典: 多くの Oracle ベンチマークは、あるバージョンが以前のバージョンよりも大幅に優れていることを誇っています。) (一方、スレッドごとのレイテンシーは桁外れに大きくなっています。)
    • 可能であれば、各スレッドはデータをバッチで処理する必要があります。
    ###バッチ処理:###

      LOAD DATA
    • は、単一スレッドから一度に多数の行を INSERT する最速の方法です。ただし、ファイルを LOAD に書き込むコストを含めると、一括挿入よりも遅くなる可能性があります。 BULK
    • INSERT
    • が続きます。ただし、特定の制限または「利益逓減」に達すると、行数は「数百」に制限されます。 バッチ挿入は、
    • INSERT
    • クエリごとに 1 行を挿入するよりも 10 倍高速です。したがって、これ (または LOAD DATA) は高速取り込みに使用する価値があります。 (出典: 多数の 異なる 時間制限テスト)
    • データソース:

    一部のデータ ソースは、一度に 1 行のみを送信する必要があります (例: N 秒ごとに車両からのセンサー データ)。これには、データをバッチ処理するための中間層が必要です。
    • データ収集に関するディスカッション:
    • http://mysql.rjweb.org/doc.php /staging_table
    • データをロードした後はどうなりますか?もちろん、これは書き込み専用のテーブルではありません。

    正規化はディスクの占有領域を縮小するのに役立ちます。バッチで行うのが最適です。
  • キャンセル返事