在同一语句中添加列+索引

时间:2018-04-14 00:55:12

标签: mysql

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

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

2 个答案:

答案 0 :(得分:2)

根据manual,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);

答案 1 :(得分: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;

请注意,可以使用就地算法时有some constraints

如果您有外键约束,将使用disable those或复制算法。而且它会很慢。

如果您的表是在5.6之前创建的,那么您需要使用复制算法rebuild the table才能切换到就地算法。

最后,如果您使用5.6之前的版本或因任何原因无法使用这些内容,请考虑使用Percona's online-schema-change