MySQL 事务大小 - 多大才太大?

thi*_*ice 24 mysql innodb transaction mysql-5.5

我有一个经常运行的导入过程,我希望它是一种“全有或全无”的交易,也就是:交易。

有很多方面,导入可能会产生 100k-1mil+ 记录之间的任何地方。这相当于有效载荷范围从几 MB 到几百 MB 的数据。

我知道临时表是另一种选择 - 但这种方法似乎很方便。

对于这种在提交之间进行大量数据操作的实践,是否有任何需要注意的警告?(在提交后的典型写入/索引负载突发之外)

Rol*_*DBA 21

需要注意的一个瓶颈是 InnoDB 日志缓冲区。大小由innodb_log_buffer_size设置。以下是 MySQL 文档对此的说明:

InnoDB 用于写入磁盘上日志文件的缓冲区的大小(以字节为单位)。默认值为 8MB。大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有大事务,增大日志缓冲区可以节省磁盘 I/O。

InnoDB 日志缓冲区不应与 InnoDB 缓冲池混淆。它们之间的主要区别在于它们的目的。InnoDB 日志缓冲区基本上会记录写入重做日志(ib_logfile0、ib_logfile1)的短期更改。InnoDB 缓冲池(由innodb_buffer_pool_size 确定大小)缓存要提交(如果页面是脏的)并最终写入磁盘的数据和索引页面。一旦提交,更改页面将保留在 RAM 中,直到通过 LRU 规则删除。

大事务必须通过日志缓冲区。如前所述,更大的日志缓冲区将减少磁盘 I/O。只有大的提交才会出现瓶颈。

您可能需要查看其他 InnoDB 选项进行配置。

我还有其他关于优化 InnoDB 的帖子以供进一步研究