0

ある時点で MySQL テーブルに何千もの挿入を実行するプログラムがあります。これらの挿入はトランザクションに囲まれています。本番データ (コピーされた prod. db) を使用して開発マシンでコードを実行すると、完了するまでに数分かかります。本番環境で実行すると、30 分以上実行されます。

dev サーバーと prod サーバーの両方が MySQL 5.1 を実行します (マイナー バージョンの違い、prod では 5.1.64 対 5.1.41)。サーバーは、12 コア、16GB RAM、高速ディスクなどを備えた強力なマシンです (私のちっぽけな開発コンピューターと比較して)。唯一の違いは、本番マシンが MySQL レプリケーション マスターでもあることです。ただし、私が書き込む特定のスキーマは複製されません。

問題を構成値に置くことに傾いていmy.cnfますが、他のアイデアが役立ちます。また、特定のスキーマはレプリケートされていませんが、binlog (セクションbinlog-ignore-db = <db-name>[mysqld]) でも無視されていないことに気付いたので、これも調査したいと考えています。

何千もの挿入規模のトランザクションの速度を向上させるために、構成値で注意を払う必要があるその他の危険信号は何ですか? バッチ挿入のパフォーマンスを向上させるには、他にどこを探す必要がありますか? ありがとう。

EDIT - これを行うコード (非常に簡略化)

ルビーで、mysql2アダプターを使用:

inserts = []

# a loop that generates INSERT statements

...
inserts << insert_stmt
...

# end loop

begin
  connection.query("BEGIN;")
  inserts.each { |q| connection.query(q) }
  connection.query("COMMIT;")
rescue
  connection.query("ROLLBACK;")
end
4

0 に答える 0