从MySQL速度和内存使用的角度来看,复制大型表的最佳方法是什么?
选项1.使用从旧表中选择X行并将它们插入到新表中。继续进行select/insert的下一次迭代,直到复制所有条目。
选项2.使用没有行限制的MySQL INSERT INTO ... SELECT。
选项3.使用MySQL INSERT INTO ... SELECT,每次运行时复制的行数量有限。
编辑:,我不会使用mysqldump。我的问题的目的是找到最好的方式来编写一个数据库转换程序。有些表变了,有些没有变。我需要自动完成整个复制/转换过程,而不必担心手动转储任何表。因此,如果您能够回答以上哪一个选项是最好的,这将是有帮助的。
发布于 2013-05-23 14:38:33
从上面列出的三个选项中删除。
如果在至少一个列上有一个唯一约束,我将选择第二个选项,因此如果在服务器超时时必须多次运行脚本以完成其任务,则不创建重复行。
否则,您的第三个选项将是方法,同时手动考虑任何服务器超时,以确定您的插入选择限制。
发布于 2013-05-23 14:22:23
有一个专门为这个任务编写的程序,名为米斯德。
发布于 2019-03-14 13:18:16
mysqldump在简化和仔细处理所有类型的数据方面是一个很好的工具,但是它没有加载数据幼稚那么快。
如果您要在同一个数据库上进行复制,我喜欢选项2的这个版本:
( a)创建像foo这样的表foo_new;
( b)插入foo_new SELECT * foo;
我有很多有数亿行(比如1/2B)和InnoDB的表,还有几个键和约束。从一个MySQL转储读取数据需要很多小时,但是加载数据不成熟只需要一个小时左右。用DB脱机复制原始文件更快,这是正确的。同样正确的是,非ASCII字符、二进制数据和NULL需要在CSV (或制表符分隔的文件)中小心处理,但幸运的是,我已经得到了大量的数字和文本:-)。我可能会花时间看上面的步骤( a)和( b)所用的时间,但我认为它们比加载数据的速度要慢。这可能是因为交易。
https://stackoverflow.com/questions/16716427
复制相似问题