MySQL交易大小-太大太大了吗?


23

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

涉及的方面很多,进口量可能在10万至100万以上的记录之间。这相当于有效载荷范围从几MB到几百MB的数据。

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

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


就个人而言,我喜欢保持平衡。我确实以1k或10k的交易量进行导入,因为我只知道它会达到900k行左右,然后由于缓冲区大小或其他荒唐的东西而崩溃。可以很容易地从中提取数据,而不需要那么多的I / O。
Captain Hypertext

Answers:


20

要注意的一个瓶颈是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以便进一步研究的文章


我以某种方式知道你会在这上面。感谢您似乎总是会给出的详尽答案。附带问题:关于innodb_io_capacity的使用,您是否有任何资源?当文档显示5400 / 7200RPM消费者SATA的值为100时,您是否建议通过将其设置为如此高来“消除限制”?
thinice 2012年

我通常将innodb_io_capacity设置得更高一些,然后让硬件将其放在首位。我现在将其添加到我的答案中。
RolandoMySQLDBA 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.