MySql-同时更改几个表

MySql-同时更改几个表,mysql,mysql-management,alter-table,alter,Mysql,Mysql Management,Alter Table,Alter,我有一个带有innoDB表的MySql数据库 我需要更改两个大表(约5000万条记录),因为更改会锁定表,我希望使过程尽可能快 就速度而言,什么是最好的: 1.一次换一张桌子 2.同时(同时)更改两个表 有什么想法吗?同时做不会给你带来太多好处。它仍然需要等到第一个任务完成后才能执行第二个任务 您可能更喜欢在查询之间有一个短的延迟来运行查询,这样从第一次更新开始就一直在等待锁的其他查询就不必再等待第二次更新。如果您的数据库正在为一个网站服务,例如,两次15秒挂起比一次30秒挂起要好 我做了一个测

我有一个带有innoDB表的MySql数据库

我需要更改两个大表(约5000万条记录),因为更改会锁定表,我希望使过程尽可能快

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


有什么想法吗?

同时做不会给你带来太多好处。它仍然需要等到第一个任务完成后才能执行第二个任务

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

我做了一个测试

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

从2010年年中开始,我的电脑是MacBookPro 13.3”,所以一切都与此相关

然后我做了三件事

  • 我连续在两个表上运行alter,添加列(总共67秒)花费了34秒和33秒
  • 我并行地在两个表上运行alter,花了1.1分钟才返回(基本上是在同一时间)(总共61秒)
  • 我重做了第一次测试,这次花了35+35秒(总共70秒)

  • 这证实了我的猜测,即并行速度不会更快。最可能的原因是,这几乎完全是一个磁盘操作,根本无法并行。

    实际上取决于服务器中的内存大小

    在执行ALTER TABLE时,您确实希望表及其最大的二级索引(记住innodb集群主键,因此PK与行一起存储)适合内存。如果不适合,则速度会很慢(注意:本讨论假设表未分区)

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

    如果它们都适合innodb缓冲池,那么就并行地执行它们,如果不能串行地执行它们


    在与产品规格相同的开发服务器上试用(显然,使用相同大小的innodb_buffer_池配置它们)

    如果我同时运行它们,通过连接两个线程,我可以使用两个不同的mysql进程,问题是一个进程是否会影响另一个进程锁的机制是同步操作。锁的机制是防止它们并行运行以避免一致性问题。只要它们都锁在同一个表上,收益将为e最小值。当第一个查询执行时,第二个查询将被提前解析和准备,但表被锁定的实际时间将是相同的。如果alter正在添加一个列,那么在内存中添加索引真的会有帮助吗?感觉它需要在每个记录上写入新数据,而这将在磁盘上。始终添加一个新列s重建整个表,包括所有索引。重建表需要重建索引,即使它们不使用新列。在该测试中您是否有20Gb的innodb\u缓冲池?