被杀死的ALTER TABLE语句是否可以部分构建索引?

时间:2011-03-25 11:57:31

标签: mysql innodb

我们启动了一个ALTER TABLE,它删除了一个索引并添加了另一个索引。虽然我们只是期望将表锁定为写入,但是读取开始排队,所以我们杀死了ALTER进程。但是当KILL结束时,旧指数已经消失,新指数就在那里,其基数低于预期。

现在在桌子上搜索似乎更快,所以好像ALTER经历了很好,但我们不确定。我们的KILL是否有可能将指数留在部分建造的阶段?

2 个答案:

答案 0 :(得分:3)

如果索引在那里,您可以认为它已完成。

您可以使用SHOW CREATE TABLESHOW INDEXES查看表格中的索引。

如评论中所述,SHOW INDEXES列出的基数只是一个估计。

您可以尝试的一项测试是运行SHOW INDEXES,然后运行ANALYZE TABLE,然后再次运行SHOW INDEXES,看看估算的基数值如何变化。

答案 1 :(得分:1)

根据您的描述(锁定读/写)您很可能使用较旧版本的InnoDB,或者在utf8字符集中为列添加索引。

以下是它在您的版本中的工作原理:

  1. 使用新表定义创建空表。
  2. 从旧表到新表一个接一个地复制行(也创建新索引)。
  3. 复制完成后,将删除旧表,重命名新表。
  4. (如果您在步骤2和3之间取消,则可以安全地删除新表。)

    完全披露 - 这是它在InnoDB插件中的工作原理(默认为MySQL 5.5,可从5.1 +获得):

    1. 读取表以查找索引的数据,并将其写入临时文件。
    2. 临时文件已排序。
    3. 通过按顺序插入数据来创建索引。
    4. (这种方法更加优化.InnoDB调用是“快速索引创建”。)