代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

使用“mysql mydb<mydb.sql”重新创建mysql db在表中有数千万条记录时非常缓慢。如何改进?

  •  0
  • nonopolarity  · 技术社区  · 14 年前

    一个拥有数千万条记录的mysql数据库似乎会得到一个很大的 INSERT INTO 陈述当以下

    mysqldump some_db > some_db.sql
    

    备份数据库。(是1个insert语句处理 全部的 记录?)

    因此,当使用

    mysql some_db < some_db.sql
    

    然后CPU几乎不忙(MySQL进程大约1.8%的使用率…我也没看到mysqld?)而且硬盘似乎不太忙…

    上次,整个恢复过程花费了5个小时。有没有办法让它更快?比如,在做的时候 mysqldump ,它能打破 INSERT 语句变短,以便 mysql 在恢复数据库时,不需要如此严格地解析行吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Donnie    14 年前

    如果有什么东西在用时间,那就是mysqld,这就是所有工作的实际内容。如果您连接到远程MySQL服务器,那么mysqld将在该计算机上,而不是本地计算机上。

    加快速度的最直接方法是从表中删除所有键和索引,然后在加载数据后创建它们。在一个服务器上,保持所有的插入都得到更新是非常繁重的,而且可能会导致最终的索引碎片化。您可以预期在插入结束时创建索引需要一段时间,但这不会像插入时保持所有索引都是最新的那样糟糕。

    一个更好的解决方案是停止对该表使用mysqldump并切换到使用 LOAD DATA INFILE (与匹配的 SELECT ... INTO OUTFILE 用于创建转储)。

    您的最佳选择是只复制数据库文件,而不是尝试进行备份和恢复。我认为这只适用于myisam数据库,而不是innodb,但是如果最近发生了变化,其他人可以纠正我。