在速度和内存使用方面复制大型MySQL表的最佳方法是什么?
选项1.使用PHP,从旧表中选择X行并将其插入新表中.继续执行select/insert的下一次迭代,直到复制完所有条目.
选项2.使用INSERT INTO ... SELECT没有行限制的MySQL .
选项3.使用MySQL INSERT INTO ... SELECT,每次运行复制有限数量的行.
编辑:我不打算使用mysqldump.我的问题的目的是找到编写数据库转换程序的最佳方法.有些表已经改变,有些表没有改变.我需要自动执行整个复制/转换过程,而不必担心手动转储任何表.因此,如果您能够回答上述哪个选项最佳,那将会很有帮助.
小智 5
mysqldump 是一个很好的工具,在简单和仔细处理所有类型的数据方面,但它不如加载数据 infile快
如果你在同一个数据库上复制,我喜欢这个版本的选项 2:
a) 创建表 foo_new LIKE foo;
b) 插入 foo_new SELECT * FROM foo;
我有很多包含数亿行(如 1/2B)AND InnoDB AND 几个键 AND 约束的表。从 MySQL 转储中读取数据需要花费很多时间,但加载数据 infile只需要一个小时左右。使用 DB 离线复制原始文件更快,这是正确的。在 CSV(或制表符分隔的文件)中需要小心处理非 ASCII 字符、二进制数据和 NULL 也是正确的,但幸运的是,我几乎有数字和文本 :-)。我可能会花时间看看上述步骤 a) 和 b) 需要多长时间,但我认为它们比加载数据 infile慢......这可能是因为事务。
关闭上面列出的三个选项。
如果您对至少一列有唯一约束,我会选择第二个选项,因此如果脚本必须运行多次才能在服务器超时时完成其任务,则不会创建重复行。
否则,您的第三个选项将是可行的方法,同时手动考虑任何服务器超时来确定插入选择限制。