2012-10-30 36 views
4

我正在更新我的AUTO_INCREMENT PRIMARY KEY ID列從INT到BIGINT的過程。我在InnoDB表中使用MySQL版本5.0.82。他們看起來是這樣的:如果我改變它的列,MySQL會對索引產生什麼影響?

FactTable 
+-------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+-------+-------------+------+-----+---------+----------------+ 
| ID | int(11)  | NO | PRI | NULL | auto_increment | 
| Path | varchar(64) | NO |  | NULL |    | 
+-------+-------------+------+-----+---------+----------------+ 

AttemptTable 
+---------+----------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+---------+----------+------+-----+---------+----------------+ 
| ID  | int(11) | NO | PRI | NULL | auto_increment | 
| TriedOn | datetime | NO |  | NULL |    | 
| FactID | int(11) | NO | MUL | NULL |    | 
+---------+----------+------+-----+---------+----------------+ 

凡AttemptTable有KEY FK1 (FactID)CONSTRAINT FK1 FOREIGN KEY (FactID) REFERENCES FactTable (ID)。所以我更新的過程中一直是:

ALTER TABLE AttemptTable DROP FOREIGN KEY FK1, 
MODIFY ID BIGINT(20) NOT NULL AUTO_INCREMENT, 
MODIFY FactID BIGINT(20) NOT NULL; 

ALTER TABLE FactTable MODIFY ID BIGINT(20) NOT NULL AUTO_INCREMENT; 

ALTER TABLE AttemptTable ADD CONSTRAINT FK1 FOREIGN KEY (FactID) 
REFERENCES FactTable (ID); 

現在,我已經注意到,在做這些修改時,該約束被丟棄後的關鍵FK1仍然存在,而且我認爲它仍然適用後的約束重建。但我的問題是,MySQL更新此密鑰是否適用於BIGINTs,還是僅維護INT功能?

我查看了ALTER TABLE的MySQL參考指南,並且發現如果列的大小減小到小於索引的長度,那麼索引將會縮短,但我找不到任何指示什麼如果底層列的大小增大,則會發生索引。 (我想知道我是否應該刪除並重新創建索引,或者如果MySQL會做我期望的)

+0

我不確定。但是,如果表格不是太大,是否可以選擇簡單地刪除indeces,執行更改,然後重新應用indeces?對於一張大桌子來說,這可能會很慢。 (雖然我認爲改變一個大表中有一個獨立的列將會像重建或調整索引一樣慢。) – Marvo

回答

3

基本上,它會在您更改列的數據類型時重建索引。

實際上,它重建了全部該表中的索引。

某些類型的ALTER TABLE語句在MySQL導致表重組

  1. 鎖定表。
  2. 使用列的新定義創建一個新的空表。
  3. 將所有數據逐行地從舊錶中複製到新表中。這自然會填充新表中的索引,就像插入新數據一樣。
  4. 交換表上的名字。
  5. 放下原始表格。
  6. 解鎖表格。

,當你在一個InnoDB表更改主鍵列,因爲每個InnoDB表存儲作爲其主鍵的聚集索引這是尤其如此。

因此,如果您更改適用於新表的列的數據類型,並且它會在將行從原始表複製到新表時填充索引。

+0

謝謝,這回答我的問題,並增加了更多的見解。並提醒我再次檢查生產機器的分區上有多少臨時可用空間。 –

+0

是的,好的想法。表重組需要足夠的空間來存放表及其索引的重複副本,至少在刪除原始表之前暫時重複一次。我遇到過無法修改ALTER TABLE的情況,因爲表大於可用磁盤空間。 –

+0

您是否有任何鏈接可以進一步閱讀?所有我能找到的是https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-redefine-column。 – bennlich

相關問題