【发布时间】:2015-06-03 17:52:11
【问题描述】:
在对 MySQL 进行测试期间,我想将多个索引添加到包含超过 5000 万行的表中。 MySQL 是否支持同时为不同的列添加 2 个索引?如果是,我需要打开 2 个会话还是可以通过一个命令完成?
【问题讨论】:
在对 MySQL 进行测试期间,我想将多个索引添加到包含超过 5000 万行的表中。 MySQL 是否支持同时为不同的列添加 2 个索引?如果是,我需要打开 2 个会话还是可以通过一个命令完成?
【问题讨论】:
是的。但是……
在旧版本中,使用
ALTER TABLE tbl
ADD INDEX(...),
ADD INDEX(...);
这样它就可以一次性完成所有工作。
在较新的版本中,ALGORITHM=INPLACE 使工作可以在 InnoDB 表的“后台”中完成,从而减少对其他处理的影响。但是,要获得INPLACE 处理,您可能需要分别添加每个索引。 [查看手册了解具体语法;自从我写这个答案以来,6 年多来发生了很多变化。另外,MySQL 和 MariaDB 也没有同步。]
Ref manual 列出了一些注意事项,例如处理PRIMARY KEY。
【讨论】:
ALTER 中完成所有事情:ALTER TABLE tbl MODIFY ... ADD PRIMARY KEY (...), ADD INDEX ..., etc;
content_id 中已经有数据,您是否要添加AUTO_INCREMENT 和PRIMARY KEY?已经是BIGINT了吗? (请告诉我们SHOW CREATE TABLE)
table1 (content_id bigint(20) unsigned NOT NULL , pid int(11) unsigned NOT NULL, status int(11) unsigned NOT NULL DEFAULT '0' , datecreated datetime DEFAULT NULL, datemodified datetime DEFAULT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MAX(content_id) 是什么?根据目前的建议,您暂定的ALTER 是什么?
在创建表的时候创建它是有用的,可以这样做:
CREATE TABLE name_of_a_new_table (col1 variable_type_1, col2 variable_type_2,
INDEX idx_col1 (col1), INDEX idx_col2 (col2));
【讨论】:
您查看过 MySQL 手册吗? InnoDB 支持快速索引创建,也许它就是你要找的:
https://dev.mysql.com/doc/refman/5.5/en/innodb-create-index.html
【讨论】: