使用速度和内存来复制大型MySQL表的最佳方法是什么?
选项1。使用PHP,从旧表中选择X行并将其插入新表中。继续执行select / insert的下一次迭代,直到复制完所有条目。
选项2。使用没有行限制的MySQL INSERT INTO ... SELECT
。
选项3。使用MySQL INSERT INTO ... SELECT
,每次运行时复制的行数有限。
编辑:我不打算使用mysqldump。我的问题的目的是找到编写数据库转换程序的最佳方法。有些表已经改变,有些表没有改变。我需要自动执行整个复制/转换过程,而不必担心手动转储任何表。因此,如果您能够回答上述哪个选项最佳,那将会很有帮助。
答案 0 :(得分:8)
有一个专门为此任务编写的程序名为mysqldump。
答案 1 :(得分:2)
关闭上面列出的三个选项。
我会选择第二个选项如果您对至少一个列有唯一约束,因此如果脚本必须多次运行才能实现其任务,则不会创建重复行服务器超时。
否则,您的第三个选项将是可行的方法,同时手动考虑任何服务器超时以确定您的插入选择限制。
答案 2 :(得分:1)
如果可能,最快的方法是使数据库脱机,只需将数据文件复制到磁盘上即可。
当然,这有一些要求:
啊,我看到你编辑了你的帖子,然后我认为这种DBA-from-hell方法不是一种选择......但是,它仍然很快!
答案 3 :(得分:1)
使用存储过程
选项二必须是最快的,但它将是一个强大的长期交易。您应该考虑使存储过程执行复制。这样你就可以从MySQL引擎中卸载一些数据解析/处理。
答案 4 :(得分:0)
我到目前为止找到的最好的方法是将文件创建为转储文件(.txt),将outfile用于文本,然后在mysql中使用infile将相同的数据提供给数据库
答案 5 :(得分:0)
MySQL的load data
查询比几乎所有其他查询都快,但是它需要将每个表导出到CSV文件。
要特别注意转义字符,并在CSV中表示NULL
值/二进制数据/等,以避免数据丢失。
答案 6 :(得分:0)
mysqldump就简单性和精心处理所有类型的数据而言是一个很好的工具,但是它不如 load data infile
如果要在同一数据库上进行复制,则我喜欢此版本的选项2:
a)创建表foo_new就像foo;
b)插入foo_new SELECT * FROM foo;
我有很多带有亿万行的表(例如1 / 2B)和InnoDB以及几个键和约束。从MySQL转储读取它们需要花费很多时间,而通过 load data infile 只需一个小时左右。脱机复制原始文件更快,这是正确的。正确处理非ASCII字符,二进制数据和NULL在CSV(或制表符分隔的文件)中也是正确的,但是幸运的是,我已经有了很多数字和文本:-)。我可能花点时间看一下上述步骤a)和b)需要花费多长时间,但是我认为它们比加载数据文件慢...这可能是由于事务。