0

約5億行のMySQLデータテーブルがあります。このデータを読み取って計算を実行する必要があり、計算されたデータ(元のデータの標準化された形式)を別のInnoDBテーブルに書き込む必要があります。

現在のセットアップは、データベースだけでなくマシンも含まれる仮想クラウドであるため、マシンとDBの接続は非常に高速です。

データに対して行われる計算(およびデータの読み取り)は非常に高速であり、このプロセス全体のボトルネックは、標準化されたデータをInnoDBテーブルに挿入することです(標準化されたデータには、長くはありませんが、いくつかの指標が含まれています。挿入が遅くなります)。

残念ながら、挿入パフォーマンスの向上に役立つinnodb_log_file_size(Amazon AWSを使用)などの特定のシステム変数を変更することはできません。

このすべてのデータをMySQLにプッシュするための最善の方法は何でしょうか。計算プロセスは単純なので、標準化されたデータを取得して任意の形式で出力するPythonスクリプトを作成できます。計算が行われるときにこのデータをその場で挿入するのは非常に遅く、時間の経過とともに遅くなります。

問題は、バルクデータをInnoDBテーブルに挿入するための(入力形式と実際のインポートの観点から)最良のプロセスは何でしょうか?

4

3 に答える 3

0

この場合、ベーステーブルでは何も実行しておらず、セカンダリinnodbテーブルのデータをスケジュールされた間隔でのみ更新する可能性が高いため、以下の手順を実行します。

  1. --where(--where"id>91919"または--where"update_time>now()--interval 1 hour")オプションを指定してmysqldumpを取得します。可能であれば、テーブルのロックも避けてください
  2. データを一時DBテーブルに復元する
  3. 一時DBで計算を行い、セカンダリテーブルを更新します
  4. 作成した一時DB/テーブルを削除します。
于 2013-03-13T17:42:32.550 に答える
0

私の最初の本能は、バッファ変数を調整するように依頼することでした。しかし、サーバー構成パラメータの多くを変更できないと言っているので、ここに別のオプションがあります...

計算を行い、出力をcsvにダンプします。これには、「SELECT...INTOOUTFILE」コマンドを使用します。次に、ターゲットのInnoDBに接続し、「set autocommit = 0」を実行してから、「load data local infile」を実行して、このCSVをターゲットテーブルにロードし直します。最後に、自動コミットを1に戻します。

私が提案できるオプションは他にもたくさんありますが(正しいパーティションスキーマ、主キーの順序の挿入など)、DBの構造、受信データセット、およびそのためのインデックスを知る必要があります。

于 2013-03-14T04:37:16.423 に答える
0

あなたの時系列データはありますか?先週同様の問題がありました。パーティションをロードすると、高速になりました。また、 http: //www.ajaydivakaran.com/2013/03/12/mysql-innodb-when-inserts-start-slowing-down/から設定を最適化しました が、最適化できない場合は、パーティションを使用して挿入を高速化します。

于 2013-03-20T01:35:24.243 に答える