在同一条语句中添加列和索引

3

有没有一种方法可以将以下内容作为一个语句而不是两个添加?每个语句都需要几个小时才能运行,所以我想知道在创建时是否可以索引它?

alter table main_table add `last_updated` datetime DEFAULT CURRENT_TIMESTAMP;
alter table main_table add index (last_updated);

据我所知,列是添加到表(文件)中的,而索引是一个单独的文件,因此即使它们在单个命令中合并,它们可能仍然需要相同的时间。 - apokryfos
2个回答

3
根据手册,ALTER TABLE 语法的相关部分如下:
ALTER TABLE tbl_name
    [alter_specification [, alter_specification] ...]

alter_specification:
  | ADD [COLUMN] col_name column_definition
        [FIRST | AFTER col_name]
  | ADD {INDEX|KEY} [index_name]
        [index_type] (index_col_name,...) [index_option] ...

这篇文章提到了在同一条语句中可以同时添加列和索引。

我已经在MySQL 5.6上测试过,并且它运行良好:

alter table main_table add `last_updated` datetime DEFAULT CURRENT_TIMESTAMP,
add index (last_updated);

2
您没有指定您的MySQL服务器版本或表引擎,但如果您正在使用最新版本的MySQL(> 5.6)的InnoDB,并且考虑使用显式Online DDL吗?
ALTER TABLE main_table
  ADD `last_updated` DATETIME DEFAULT CURRENT_TIMESTAMP,
  ADD INDEX (`last_updated`),
      ALGORITHM=inplace,
      LOCK=none;

请注意,对于原地算法的使用存在一些限制
如果启用了外键约束,则需要禁用这些约束或使用复制算法。而且速度会很慢。
如果表是在5.6之前创建的,则需要使用复制算法重建该表才能切换到原地算法。
最后,如果您使用的是5.6之前的版本或者由于任何原因上述方法都不适用,请考虑使用Percona的在线模式更改

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接