2011-11-25 26 views
0

我有一個帶有innoDB表的MySql db。MySql - 在同一時間改變幾張表

我需要改變一些大表(~50M記錄),因爲改變鎖定表我想盡可能快地完成這個過程。

什麼是最好的速度的條件:1。 改變一個表在同一時間 2.改變在同一時間(同時)

任何想法,這兩個表?

回答

0

真的取決於你的服務器有多少內存。

當你在做ALTER TABLE時,你真的想要這個表和它最大的二級索引(記住innodb把主鍵,所以PK和行一起存儲)適合內存。如果不是這樣,它會變慢(注意:這個討論假定表格沒有分區)。

由於你的表有一個微小的 50M行,所以它的所有輔助索引很容易適合內存(你的服務器上有32G +,對嗎?)。

如果它都適合在innodb緩衝池中,請並行執行它們。如果它不能串聯。

嘗試具有相同規格的生產開發服務器上(很明顯,同樣大小innodb_buffer_pool配置它們)

+0

謝謝!!偉大的投入。 – Ran

+0

如果alter正在添加一列,它是否真的有助於在內存中創建索引?感覺就像它需要在每條記錄上寫入新數據一樣,這將在磁盤上。 –

+0

添加一個新的列總是重建整個表,包含所有索引。重建表格需要重建索引,即使它們不使用新列。 – MarkR

0

同時做並不會給你帶來太多收益。它仍然要等到第一個完成第二個。

您可能更喜歡在它們之間運行這些查詢並使其延遲一段時間,以便自第一次更新開始以來一直等待鎖定的其他查詢不必等待第二個查詢。例如,你的數據庫服務於一個網站,兩個15秒鐘掛起比單個30秒鐘更好。

+0

如果我同時運行它們,我可以用2線連接2個不同的MySQL進程使它,問題是一個過程是否會影響另一個過程 – Ran

+0

鎖的機制是同步操作。它阻止它們並行運行以避免一致性問題。只要他們鎖定同一張桌子,增益就會很小。在第一個查詢執行時,第二個查詢將被預先解析和準備,但表的鎖定實際時間將是相同的。 –

2

我做了一個測試。

我創建了一個有4百萬行的表。非常簡單的表格,一列和所有的值對於所有行都是「夥計」。然後我將該表複製到包含完全相同數據的big_2中。

我的電腦是MacBook Pro的13.3" ,從2010年中期所以一切都關係到這一點。

我那麼做了三件事情。

  1. 我跑在連續兩個表的修改,花了34和33秒添加列(總共67秒)
  2. 我在兩個表中平行運行alter,它花了1.1分鐘才返回(基本上是在同一時間)(共61秒)
  3. 我redid第一測試,這一次花了35 + 35秒(總共70)

這證實了我的懷疑,即它並不會更快。最可能的原因是這幾乎完全是磁盤上的操作,並且這根本無法並行。

+0

謝謝你的回覆:) – Ran

+0

你在測試中有20G的innodb_buffer_pool嗎? – MarkR

+0

不,當然不是。 –