0

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

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

就速度而言,什么是最好的: 1. 一次更改一个表 2. 同时更改两个表(同时)

有任何想法吗?

4

3 回答 3

2

我做了一个测试。

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

我的电脑是 2010 年中期的 macbook pro 13.3",所以一切都与此有关。

然后我做了三件事。

  1. 我在两个表上连续运行了一个更改,添加列需要 34 秒和 33 秒(总共 67 秒)。
  2. 我在两张桌子上并行运行了 alter,它们返回之前花了 1.1 分钟(基本上同时)(总共 61 秒)
  3. 我重做了第一次测试,这次花了​​ 35 + 35 秒(总共 70 秒)

这证实了我的怀疑,即并行运行不会更快。最可能的原因是这几乎完全是磁盘上的操作,根本无法并行。

于 2011-11-25T20:05:17.290 回答
0

同时做不会给你太多的收获。它仍然必须等到第一个完成才能进行第二个。

您可能更喜欢在查询之间有很短的延迟来运行查询,这样自第一次更新开始以来一直在等待锁定的其他查询也不必等待第二次更新。例如,如果您的数据库正在为网站提供服务,那么两次 15 秒的挂起比一次 30 秒的挂起要好。

于 2011-11-25T19:32:50.447 回答
0

实际上取决于您的服务器中有多少内存。

当您执行 ALTER TABLE 时,您真的希望表及其最大的二级索引(记住 innodb 聚集主键,因此 PK 与行一起存储)适合内存。如果没有,它会很慢(注意:这个讨论假设表没有分区)。

由于您的表只有50M行,因此它很可能适合 RAM(您的服务器上有 32G+,对吗?)及其所有二级索引。

如果这一切都适合 innodb 缓冲池,请并行执行。如果它不按顺序执行它们。

在与生产具有相同规格的开发服务器上尝试(显然将它们配置为相同大小的 innodb_buffer_pool)

于 2011-11-25T20:19:53.053 回答