MySQL从一个表缓慢复制到另一个表

时间:2013-08-27 15:13:12

标签: mysql sql database performance copy

我使用以下语句将文件从一个数据库复制到另一个数据库:

INSERT INTO database1.table Select ... FROM database2.table

一切正常,但真的很慢。对于400,000个数据库(大约600mb),我花了几个小时。

我正在使用MyISAM表来执行此操作。

我的主键是一个唯一的标识符,它是由不同的数据域构建的。

我可以通过添加一个使用唯一标识符的新列来加速复制过程,假设一个整数从1开始并转到最后一行并使其成为AUTO_INCREMENT,复制文件时它也会上升吗? 或者可能在新列上设置索引?

如果你能帮助我加快复制过程,我真的很高兴。

2 个答案:

答案 0 :(得分:1)

从一张桌子到另一张桌子的复制速度在很大程度上取决于很多东西,因此很难给出一个“这就是答案。”

这里有一些可能会出现问题的事情:

  1. 您似乎正在从一个数据库中的表复制到另一个数据库中的表。如果这两个数据库位于同一物理磁盘上,那么当磁盘搜索,读取,搜索,写入时,您将会有一些性能损失。
  2. 目标表是否有索引?如果是这样,MySQL可能在数据插入的同时编制索引。这可能会大大减慢数据副本的速度。禁用索引,复制数据,然后启用索引会更快。
  3. MySQL有许多用于缓存,内存管理等的调优参数。这些设置对于复制数据可能不是最理想的。自从我使用MySQL以来已经有一段时间了,但我记得有一个数据调整工具可以读取日志并告诉你性能命中的来源。
  4. 我使用的数据库包含数十亿行。当我不得不进行批量插入或批量复制时,索引是一个巨大的性能损失。你没有向我们展示表格的结构,但应该认真研究上面的#2。

答案 1 :(得分:0)

步骤1:如果可以,请停止使用糟糕的MyISAM引擎。读取速度非常快,但写入性能可能很残酷,并且通常整个表都会被锁定以保持一致性,因为不支持事务。 InnoDB可以更好地处理并发写入,并且具有记录的额外好处,因此如果您的服务器未正确关闭,您的表格不太可能完全被破坏。

步骤2:禁用目标表上的索引,或者在插入数据之前延迟创建索引。更新索引会增加大量开销。你这样做是一次性插入,因此惩罚较低,但仍然不为零。