ALTER TABLE语句可能会导致部分内建索引吗?
问题描述:
我们启动了一个ALTER TABLE,它删除了一个索引并添加了另一个索引。虽然我们只希望表被锁定写入,但读取开始排队,所以我们终止了ALTER过程。但是当KILL结束时,旧的指数消失了,新的指数取而代之,基数低于预期。ALTER TABLE语句可能会导致部分内建索引吗?
在桌面上搜索似乎现在更快,所以它看起来像ALTER经过很好,但我们不知道。我们的KILL是否有可能在部分建成阶段离开指数?
答
如果索引在那里,您可能会认为它是完整的。
您可以使用SHOW CREATE TABLE
或SHOW INDEXES
查看表格上的索引。
正如在评论中指出的,SHOW INDEXES
列出的基数只是一个估计值。
您可以尝试的一个测试是运行SHOW INDEXES
,然后运行ANALYZE TABLE
,然后再次运行SHOW INDEXES
并查看估计的基数值是如何变化的。
答
通过您的描述(两个读取/写入锁定),您很可能会使用旧版本的InnoDB,或者将索引添加到utf8字符集的列中。
下面是它如何在您的版本:
- 空表与新表定义创建。
- 将行从旧表复制到新表(也会创建新索引)。
- 一旦复制完成,旧表被删除,新表被重新命名。
完全公开(如果步骤2 & 3新表只是安全删除之间取消。) - 这里是InnoDB的插件是如何工作的(默认为MySQL 5.5,可从5.1+ ):
- 通过读取表来查找索引的数据并写入临时文件。
- 对临时文件进行排序。
- 该索引是通过按顺序插入数据而创建的。
(这种方法更优化InnoDB的要求是“快速索引创建”。)
一件事要注意的是InnoDB的测算基数:http://www.mysqlperformanceblog.com/2009/ 9月28日/为什么 - InnoDB的指数基数-变化,奇怪的/ – 2011-03-25 12:51:41