【问题标题】:Adding multiple indexes at same time in MySQLMySQL中同时添加多个索引
【发布时间】:2015-06-03 17:52:11
【问题描述】:

在对 MySQL 进行测试期间,我想将多个索引添加到包含超过 5000 万行的表中。 MySQL 是否支持同时为不同的列添加 2 个索引?如果是,我需要打开 2 个会话还是可以通过一个命令完成?

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    是的。但是……

    在旧版本中,使用

    ALTER TABLE tbl
        ADD INDEX(...),
        ADD INDEX(...);
    

    这样它就可以一次性完成所有工作。

    在较新的版本中,ALGORITHM=INPLACE 使工作可以在 InnoDB 表的“后台”中完成,从而减少对其他处理的影响。但是,要获得INPLACE 处理,您可能需要分别添加每个索引。 [查看手册了解具体语法;自从我写这个答案以来,6 年多来发生了很多变化。另外,MySQL 和 MariaDB 也没有同步。]

    Ref manual 列出了一些注意事项,例如处理PRIMARY KEY

    【讨论】:

    • 很高兴知道。我想知道的另一个信息是,如果我们想修改一个列以成为主键 auto_increment ,以下命令是否向我们保证 auto_increment 从第一条记录开始: ALTER TABLE table1 modify column content_id bigint(20) AUTO_INCREMENT primary key; ?
    • 添加主键需要重写表(慢速方法)。是的,你可以(应该,为了速度)在一个 ALTER 中完成所有事情:ALTER TABLE tbl MODIFY ... ADD PRIMARY KEY (...), ADD INDEX ..., etc;
    • 如果content_id 中已经有数据,您是否要添加AUTO_INCREMENTPRIMARY KEY?已经是BIGINT了吗? (请告诉我们SHOW CREATE TABLE
    • 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 是什么?
    【解决方案2】:

    在创建表的时候创建它是有用的,可以这样做:

    CREATE TABLE name_of_a_new_table (col1 variable_type_1, col2 variable_type_2,
           INDEX idx_col1 (col1), INDEX idx_col2 (col2));
    

    【讨论】:

      【解决方案3】:

      您查看过 MySQL 手册吗? InnoDB 支持快速索引创建,也许它就是你要找的:

      https://dev.mysql.com/doc/refman/5.5/en/innodb-create-index.html

      【讨论】:

      • 感谢您的链接,我会测试并回复。
      • @Peter Mortensen:我提交了带有固定 URL 的编辑请求,我不再在我的活动中看到该条目。发生了什么?
      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多