2013-07-17 55 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),並且通過觸發器的幫助另外確保在執行改變過程時插入原始表格中的數據也被寫入改變的表格。

相關問題