ある時点で 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