2013-07-17 51 views
2

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

+1

你将如何存储密码?如果你使用一个合理的散列函数,那么这肯定是最耗时的单个任务。 – JimL

+0

我在循环中使用PHP rand()生成密码。但此方法需要很长时间 –

+0

作为替代方法(如果可以的话)将密码列添加到表中并在需要时为用户生成密码。这种方式将随着时间的推移而不是一次全部传播。 –

回答

-1

一个可能的方案

  1. 生成所有的密码到一个文件,你的PHP脚本
  2. 创建临时表和使用LOAD DATA INFILE(这恰好是从文件导入数据的最快方法),以从加载数据密码文件。
  3. 改变你的表并添加password
  4. 使用UPDATE与加入从临时表中的原始表更新密码栏
  5. 删除临时表
+0

亲爱的downvoter不要害羞。让我们听听投票是什么? – peterm

-1

请记住,对于改变表操作可能需要很长时间,我会建议分开这两个步骤。

1)改变表,在这里我建议以下步骤(伪):

  • 创建NEW_TABLE像OLD_TABLE
  • 改变NEW_TABLE添加列密码
  • INSERT INTO NEW_TABLE(列)SELECT *从OLD_TABLE
  • 重命名OLD_TABLE到old_table_bck,NEW_TABLE到OLD_TABLE
  • 降old_table_bck

在这一点上,你有你的原始表与新列。

2)现在,当你改变你的结构后,你可以用你的php填充新的'密码'列。如果您使用InnoDB作为存储引擎,时间并不重要,因为您没有使用更新锁定表。如果你在交易中这样做,我会建议将更新过程分解为较小的交易,而不是插入一个大的交易量。

如果您不容采取(最小的)的停机时间,我建议你看pt-online-schema-change,我们用我们的努力不容任何停机时间,以进行架构更改,而数据库运行的主要数据库这个工具。它粗略地执行上述步骤(1),并且通过触发器的帮助另外确保在执行改变过程时插入原始表格中的数据也被写入改变的表格。

相关问题