mysqldump vs select into outfile

时间:2013-04-02 15:48:37

标签: mysql

我在mysql中使用select * into outfile选项将数据备份为制表符分隔格式的文本文件。我在每张桌子上都这样说。

我使用load data infile将数据导入到每个表的mysql中。

我执行此操作时尚未执行任何锁定或禁用键

现在我面临一些问题:

  1. 当它正在备份另一个时,更新和选择变得越来越慢。
  2. 导入大型表格的数据需要花费太多时间。
  3. 如何改进解决上述问题的方法?

    mysqldump是一个选项吗?我看到它使用了insert语句,所以在我尝试之前,我想请求建议。

    在每次“加载数据”之前使用锁定和禁用键是否会提高导入速度?

2 个答案:

答案 0 :(得分:4)

如果您有很多数据库/表,那么使用mysqldump肯定会更容易,因为您只需要为每个数据库运行一次(如果您对所有数据库执行完全备份,则需要运行一次)你的系统)。此外,它的优势在于它还可以备份您的表结构(仅使用select *不能执行此操作)。

速度可能类似,但最好同时测试两者,看看哪种效果最好。

有人here测试了这些选项,并且mysqldump在他的情况下被证明更快。但是,YMMV。

如果你关心速度,还要看一下mysqldump / mysqlimport组合。如mentioned here,它比单独的mysqldump快。

至于锁和禁用键,我不确定,所以我会让其他人回答那部分:)

答案 1 :(得分:2)

如果您希望数据备份一致,则使用mysqldump非常重要。也就是说,从所有表转储的数据代表同一时刻。

如果逐个转储表,它们不同步,因此您可以拥有一个表的数据,该表引用另一个表中未包含在第二个表的备份中的行。当你恢复时,它不会很漂亮。

为了表现,我正在使用:

mysqldump --single-transaction --tab mydatabase

这个转储每个表,一个.sql文件用于表定义,一个.txt文件用于数据。

然后当我导入时,我运行.sql文件来定义表:

mysqladmin create mydatabase
cat *.sql | mysql mydatabase

然后我导入所有数据文件:

mysqlimport --local --use-threads=4  mydatabase  *.txt

通常,运行mysqlimport比mysqldump默认运行insert语句输出要快。只要你有足够的CPU资源,运行带多个线程的mysqlimport也应该更快。

还原时使用锁定无助于提高性能。

禁用密钥旨在推迟创建索引,直到数据完全加载并重新启用密钥为止,但这仅对MyISAM表中的非唯一索引有帮助。但是你不应该使用MyISAM表。

有关详细信息,请阅读: