0

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

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

它工作得很好,但真的很慢。对于 400.000 个数据行(大约 600mb),我花了几个小时。

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

我的主键是由不同数据字段构建的唯一标识符。

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

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

4

2 回答 2

2

从一张表复制到另一张表的速度很大程度上取决于很多事情,因此很难给出一个单一的“这就是答案”。

在我的脑海中,这里有一些可能是问题的事情:

  1. 您似乎正在从一个数据库中的表复制到另一个数据库中的表。如果这两个数据库位于同一个物理磁盘上,那么在磁盘寻道、读取、寻道、写入时,您将受到一些性能损失。
  2. 目标表是否有索引?如果是这样,MySQL 可能在数据插入的同时进行索引。这会大大减慢数据复制速度。禁用索引、复制数据然后启用索引会快得多。
  3. MySQL 有很多用于缓存、内存管理等的调整参数。这些设置对于复制数据可能不是最理想的。自从我使用 MySQL 以来已经有一段时间了,但我记得有一个数据调整工具可以读取日志并告诉您性能下降的来源。

我使用过包含数十亿行的数据库。当我不得不进行批量插入或批量复制时,索引是一个巨大的性能损失。您没有向我们展示表格的结构,但应该认真研究上面的#2。

于 2013-08-27T15:36:47.870 回答
0

第 1 步:如果可以,请停止使用蹩脚的 MyISAM 引擎。读取速度非常快,但写入性能可能很残酷,并且由于不支持事务,通常整个表会被锁定以保持一致性。InnoDB 可以更好地处理并发写入,并且具有日志记录的额外好处,因此如果您的服务器未正确关闭,您的表被完全丢弃的可能性要小得多。

第 2 步:禁用目标表上的索引,或延迟创建索引,直到插入数据。更新索引会增加大量开销。您将其作为一次性插入执行,因此惩罚较低,但仍然非零。

于 2013-08-27T15:30:19.480 回答