ALTER TABLE语句可能会导致部分内建索引吗?

问题描述:

我们启动了一个ALTER TABLE,它删除了一个索引并添加了另一个索引。虽然我们只希望表被锁定写入,但读取开始排队,所以我们终止了ALTER过程。但是当KILL结束时,旧的指数消失了,新的指数取而代之,基数低于预期。ALTER TABLE语句可能会导致部分内建索引吗?

在桌面上搜索似乎现在更快,所以它看起来像ALTER经过很好,但我们不知道。我们的KILL是否有可能在部分建成阶段离开指数?

+1

一件事要注意的是InnoDB的测算基数:http://www.mysqlperformanceblog.com/2009/ 9月28日/为什么 - InnoDB的指数基数-变化,奇怪的/ – 2011-03-25 12:51:41

如果索引在那里,您可能会认为它是完整的。

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

正如在评论中指出的,SHOW INDEXES列出的基数只是一个估计值。

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

通过您的描述(两个读取/写入锁定),您很可能会使用旧版本的InnoDB,或者将索引添加到utf8字符集的列中。

下面是它如何在您的版本:

  1. 空表与新表定义创建。
  2. 将行从旧表复制到新表(也会创建新索引)。
  3. 一旦复制完成,旧表被删除,新表被重新命名。

完全公开(如果步骤2 & 3新表只是安全删除之间取消。) - 这里是InnoDB的插件是如何工作的(默认为MySQL 5.5,可从5.1+ ):

  1. 通过读取表来查找索引的数据并写入临时文件。
  2. 对临时文件进行排序。
  3. 该索引是通过按顺序插入数据而创建的。

(这种方法更优化InnoDB的要求是“快速索引创建”。)