我们启动了一个ALTER TABLE,它删除了一个索引并添加了另一个索引。虽然我们只是期望将表锁定为写入,但是读取开始排队,所以我们杀死了ALTER进程。但是当KILL结束时,旧指数已经消失,新指数就在那里,其基数低于预期。
现在在桌子上搜索似乎更快,所以好像ALTER经历了很好,但我们不确定。我们的KILL是否有可能将指数留在部分建造的阶段?
答案 0 :(得分:3)
如果索引在那里,您可以认为它已完成。
您可以使用SHOW CREATE TABLE
或SHOW INDEXES
查看表格中的索引。
如评论中所述,SHOW INDEXES
列出的基数只是一个估计。
您可以尝试的一项测试是运行SHOW INDEXES
,然后运行ANALYZE TABLE
,然后再次运行SHOW INDEXES
,看看估算的基数值如何变化。
答案 1 :(得分:1)
根据您的描述(锁定读/写)您很可能使用较旧版本的InnoDB,或者在utf8字符集中为列添加索引。
以下是它在您的版本中的工作原理:
(如果您在步骤2和3之间取消,则可以安全地删除新表。)
完全披露 - 这是它在InnoDB插件中的工作原理(默认为MySQL 5.5,可从5.1 +获得):
(这种方法更加优化.InnoDB调用是“快速索引创建”。)