Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用innodb作为引擎向大表添加密钥时如何进行优化?_Mysql_Innodb - Fatal编程技术网

Mysql 使用innodb作为引擎向大表添加密钥时如何进行优化?

Mysql 使用innodb作为引擎向大表添加密钥时如何进行优化?,mysql,innodb,Mysql,Innodb,有一张几百万行的桌子。 我提交以下查询: ALTER TABLE my_data ADD KEY `sex_birth` (`sex`, `birth`); 这需要38分钟44.53秒 如何优化此查询以更快地运行?您无法真正使此查询更快。但是您肯定可以做一些事情,这样您的应用程序不会宕机太久 使用其他名称创建此表的副本,例如my\u data\u alter。在这张桌子上运行alter 您将需要运行的所有更新/插入/删除的日志,因为您在alter完成时获取了副本。然后您必须运行这些查询到my\

有一张几百万行的桌子。 我提交以下查询:

ALTER TABLE my_data ADD KEY `sex_birth` (`sex`, `birth`);
这需要38分钟44.53秒


如何优化此查询以更快地运行?

您无法真正使此查询更快。但是您肯定可以做一些事情,这样您的应用程序不会宕机太久

使用其他名称创建此表的副本,例如
my\u data\u alter
。在这张桌子上运行alter

您将需要运行的所有更新/插入/删除的日志,因为您在alter完成时获取了副本。然后您必须运行这些查询到
my\u data\u alter

如果表中发生的事务数量太多,这将是一种永无止境的循环

最后,只需在一个查询中重命名这两个表

我知道这会有点棘手。在非高峰时间做这种事情


我建议您编写一些脚本来完成这项工作。

这可能需要一段时间,但此操作非常罕见,因此您只需要处理它。例如,Twitter的家伙们说,在他们的数据库中添加一个新列需要2周的时间。