2012-10-30 33 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

相关问题