【问题标题】:mysqldump vs select into outfilemysqldump vs select into outfile
【发布时间】:2013-03-24 00:09:28
【问题描述】:

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

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

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

现在我面临一些问题:

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

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

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

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

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

    如果您关心速度,还可以看看 mysqldump/mysqlimport 组合。如mentioned here,比单独使用mysqldump要快。

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

    【讨论】:

      【解决方案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 表。

      欲了解更多信息,请阅读:

      【讨论】:

        猜你喜欢
        • 2011-02-21
        • 1970-01-01
        • 2020-02-24
        • 2018-07-02
        • 1970-01-01
        • 2012-02-26
        • 2014-05-28
        • 2010-11-05
        • 2011-05-14
        相关资源
        最近更新 更多