将索引添加到300万行MySQL

时间:2012-09-02 19:00:03

标签: mysql indexing innodb

我需要在InnoDB表上为int(1)类型的列添加至少1个索引。索引需要大约300万行。这是我的生产服务器上的一个数据库,每天都有成千上万的人使用它。我尝试以标准方式添加索引,但它占用了太多时间(我让它在杀死进程之前运行大约7分钟)并锁定行,这意味着许多用户冻结了应用程序。

运行所有这些的我的VPS拥有512mb的RAM并且具有Intel Xeon E5504处理器。

如何在不中断用户体验的情况下为此生产数据库添加索引?

2 个答案:

答案 0 :(得分:0)

看看pt-online-schema-change。我认为这个工具对你的情况非常有用。它显然会给你的数据库服务器带来额外的负担,但是在大多数操作时间内不应该阻止对表的访问。

答案 1 :(得分:0)

除非该表读取XOR写入,否则您可能需要删除该站点。锁定数据库,运行操作并等待。

如果表是只写交换,则写入临时表并在旧表上运行操作,然后将写入交换回旧表并插入临时表中的数据。

如果表格是只读的,请复制表格并在副本上运行操作。

如果表是读/写,那么可能工作的一个混乱的替代方法是创建一个带有索引的新表,并将主键起始点设置为原始表中的下一个值,为您的读取请求添加一个连接,以便从两个表中进行选择,但只能写入新表。然后编写一个从旧表插入到新表的脚本,然后删除旧表中的行。这将花费很长时间,远远超过停机时间,而且很多都可能出错,但应该可以做到。

您可以使用

设置主键的起点
ALTER TABLE `my_table` AUTO_INCREMENT = X;
希望有所帮助。