4

我在 mysql 中使用 select * into outfile 选项将数据备份到制表符分隔格式的文本文件中。我针对每个表调用此语句。

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

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

现在我面临一些问题:

  1. 虽然它正在备份另一个,但更新和选择变得越来越慢。
  2. 为大表导入数据需要太多时间。

如何改进解决上述问题的方法?

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

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

4

2 回答 2

4

如果您有很多数据库/表,那么使用 mysqldump 肯定会容易得多,因为您只需要为每个数据库运行一次(或者甚至为所有数据库运行一次,如果您对系统进行完整备份) . 此外,它还具有备份表结构的优点(仅使用 select * 无法做到这一点)。

速度可能相似,但最好同时测试两者,看看哪一个最适合您的情况。

这里有人测试了这些选项,在他的情况下 mysqldump 被证明更快。但同样,YMMV。

如果您关心速度,还请查看 mysqldump/mysqlimport 组合。正如这里提到的,它比单独使用 mysqldump 更快。

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

于 2013-05-21T12:22:13.663 回答
4

如果您希望数据备份保持一致,则使用 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 默认输出的插入语句要快。只要您有空闲的 CPU 资源,使用多线程运行 mysqlimport 也应该更快。

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

禁用键旨在将索引创建推迟到数据完全加载并重新启用键之后,但这仅有助于 MyISAM 表中的非唯一索引。但是你不应该使用 MyISAM 表。

有关更多信息,请阅读:

于 2017-02-28T21:20:35.833 回答