更新mysql中超过百万条记录的最佳方式


Best way to update over million records in mysql

我有一个mysql表,它有超过一百万行的用户信息。我想在该表中添加一个列"password",随机生成密码并更新所有记录(使用PHP)。执行此任务的最快方法是什么?提前谢谢。

一种可能的场景

  1. 使用php脚本将所有密码生成到一个文件中
  2. 创建临时表并使用LOAD DATA INFILE(这恰好是从文件导入数据的最快方法)从密码文件加载数据
  3. 更改表并添加password
  4. 使用带有联接的UPDATE从临时表更新原始表中的密码列
  5. 删除临时表

请记住,更改表的操作可能需要很长时间,我建议将这两个步骤分开。

1) 更改表格,在这里我推荐以下步骤(伪代码):

  • 像旧表一样创建新表
  • 更改new_table添加列密码
  • 插入到newtable(列)中从oldtable中选择*
  • 重命名old_table为old_table_bck,将new_table重命名为old_table
  • 删除旧表

此时,您就有了带有新列的原始表。

2) 现在,在您更改了结构之后,您可以用php填充新的列"password"。如果您使用InnoDB作为存储引擎,时间无关紧要,因为您没有用更新锁定表。如果您在事务中这样做,我建议将更新过程分解为较小的事务,而不是插入一个大批量。

如果您不能进行(最短的)停机时间,我建议您查看pt-online-schema-change,我们在主要数据库上使用此工具,在这些数据库上,我们不能在数据库运行时为进行架构更改而进行任何停机。它大致执行上述步骤(1),并在触发器的帮助下额外确保在执行更改过程时插入到原始表上的数据也写入到更改后的表中。