我有一个程序在某些时候会在 MySQL 表中执行数千次插入。这些插入被事务包围。当我使用生产数据(复制的 prod.db)在开发机器上运行代码时,需要几分钟才能完成。当我在生产中运行它时,它运行了 30 多分钟。
dev 和 prod 服务器都运行 MySQL 5.1(具有次要版本差异,5.1.64 与 prod 中的 5.1.41)。服务器是一台功能强大的机器,具有 12 个内核、16GB RAM、快速磁盘等(与我微不足道的开发计算机相比)。唯一的区别是生产机器也是 MySQL 复制主机。但是,我写入的特定模式不会被复制。
我倾向于将问题放在my.cnf
配置值上,但任何其他想法都会有所帮助。我还注意到,虽然没有复制特定的模式,但它也没有在 binlog 中被忽略(binlog-ignore-db = <db-name>
在本[mysqld]
节中),所以这也是我想研究的。
在配置值中我应该注意哪些其他危险信号以提高数千次插入规模事务的速度?我还应该在哪里提高批量插入性能?谢谢。
编辑 - 执行此操作的代码(非常简化)
在红宝石中,使用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