MySql - 同时改变几个表

时间:2011-11-25 19:21:00

标签: mysql mysql-management alter-table alter

我有一个带有innoDB表的MySql Db。

我需要更改几个大表(约50M记录),因为更改锁定我希望尽可能快地完成进程的表。

速度方面最好的是: 1.一次改变一张桌子 2.同时改变两个表(同时)

任何想法?

3 个答案:

答案 0 :(得分:2)

我做了一个测试。

我创建了一个包含400万行的表。非常简单的表,一列和所有值都是“dude”的所有行。然后我将该表复制到包含完全相同数据的big_2中。

从2010年中期开始,我的电脑是Macbook pro 13.3“所以一切都与此有关。

然后我做了三件事。

  1. 我在两张桌子上连续进行了一次改动,添加了这个专栏需要34秒和33秒(总共67秒)。
  2. 我在两个桌子上并行运行,在他们返回之前花了1.1分钟(基本上是在同一时间)(总共61s)
  3. 我重新进行了第一次测试,这次花了​​35 + 35秒(总共70次)
  4. 这证实了我的怀疑,它并不会更快。最可能的原因是,这几乎完全是磁盘上的操作,而且根本无法并行。

答案 1 :(得分:0)

同时做它不会给你带来太多好处。它仍然要等到第一个完成第二个。

您可能更喜欢在它们之间有短暂的延迟运行查询,因此自第一次更新开始以来一直等待锁定的其他查询也不必等待第二次更新。例如,你的数据库服务于一个网站,两个15秒挂起比一个30秒一个好。

答案 2 :(得分:0)

真的取决于你的服务器有多少内存。

当你在做ALTER TABLE时,你真的想要这个表及其最大的二级索引(记住innodb群集主键,因此PK与行一起存储)以适应内存。如果没有,那就会很慢(注意:这个讨论假定表没有被分区)。

由于你的表有一个 tiny 50M的行,它很可能很容易适合RAM(你的服务器上有32G +,对吧?)及其所有二级索引。

如果它全部适合innodb缓冲池,请并行执行。如果它没有连续执行。

在您的开发服务器上尝试使用与生产相同的规范(显然使用相同大小的innodb_buffer_pool配置它们)