我需要在 InnoDB 表上的 int(1) 类型的列中添加至少 1 个索引。它需要索引大约 300 万行。这是我的生产服务器上的一个数据库,每天有成千上万的人在使用它。我尝试以标准方式添加索引,但它占用了太多时间(我让它运行了大约 7 分钟,然后才终止进程)并锁定了行,这意味着许多用户的应用程序被冻结。
运行所有这些的我的 VPS 有 512mb 的 RAM,并有一个 Intel Xeon E5504 处理器。
如何在不中断用户体验的情况下向此生产数据库添加索引?
看看pt-online-schema-change。我认为这个工具在你的情况下非常有用。它显然会给您的数据库服务器增加额外的负载,但在大多数操作时间内不应阻止对表的访问。
除非该表读取 XOR 写入,否则您可能需要关闭该站点。锁定数据库,运行操作并等待。
如果表是只写表,则将写入交换到临时表并在旧表上运行操作,然后将写入交换回旧表并插入临时表中的数据。
如果该表是只读的,请复制该表并在副本上运行该操作。
如果表是读/写的,那么一个可能有效的混乱替代方案是使用索引创建一个新表并将主键起点设置为原始表中的下一个值,在您的读取请求中添加一个连接以选择从两个表中,但专门写入新表。然后编写一个脚本,从旧表插入新表,然后删除旧表中的行。这将花费比停机时间更长的时间,而且可能会出现很多问题,但它应该是可行的。
您可以设置主键的起点
ALTER TABLE `my_table` AUTO_INCREMENT = X;
希望有帮助。