【问题标题】:Why is import of SQL so slow?为什么导入 SQL 这么慢?
【发布时间】:2012-04-30 21:48:26
【问题描述】:

我有一个 SQL 文件,其中包含两个总共大约 600,000 行的表。昨天,我尝试将文件导入到我在 Fedora 16 上的 MySQL 数据库中,导入文件花了 2 个多小时。在我的 Windows PC 上花了 7 分钟。我的 Linux 和 Windows 机器具有完全相同的硬件。我的几个朋友也尝试过,他们也有类似的经历。

我们使用的命令是:mysql -u root database_name < sql_file.sql

为什么会有这样的速度差异?

【问题讨论】:

  • 相同的表类型(INNODB/MYISAM/...)?
  • 是的,表类型都是一样的:Innodb
  • 你检查过 mysqlimport 吗?见stackoverflow.com/questions/2956407/…
  • @LarsSteen 在不了解硬件的情况下很难判断 Windows 是“太快”还是 Fedora“太慢”。例如,磁盘是 SSD 还是旋转磁盘?
  • @JoachimIsaksson 这是一个旋转磁盘。型号:WDC WD5000BEVT-2 5400rpm。

标签: mysql windows linux


【解决方案1】:

为什么不将 .sql 文件导出为 BULK INSERT 选项并导入它,在使用 mysqldump 进行备份时尝试这些选项

--extended-insert:使用多行插入语句

--quick: 行数据不做缓冲,如果表很大就好了

注意:在生成 .sql 文件之前,请确保在 my.cnf 文件中增加 max_allowed_packet=32M 或更多的值。

【讨论】:

  • 谢谢你的回答,我去看看。
  • @LarsSteen Mahesh Patil 的建议有什么不同吗?
  • 没有。没有太大区别。
【解决方案2】:

我敢打赌,Fedora 16 尊重事务/同步语义,而 Windows 则不然。如果你算一下,两小时内 600,000 次更新是每分钟 5,000 次。这与磁盘的旋转速度在一个数量级。

您可以尝试将SET autocommit=0; 添加到导入文件的开头,将COMMIT; 添加到末尾。请参阅this page 了解更多信息。

【讨论】:

  • 这有很大的不同!刚试了一遍,导入总时间不到3分钟。坦克很多:)
  • 出于好奇,这意味着什么?我认为 MySQL 的创建者没有无缘无故地将其置于慢速模式?
  • @Prinsig 它只影响断电或系统在操作过程中崩溃的情况。如果您愿意在发生这种情况时使用干净的数据库重新启动操作,那么您可以禁用这些安全措施。
  • 当然,你可以使用像(echo "SET autocommit = 0"; cat MyInputFile; echo "COMMIT;" ) | mysql ...这样的命令行
  • SET autocommit=0 后的分号;被省略。完整命令应如下所示: (echo "SET autocommit = 0; "; cat MyInputFile; echo "COMMIT;" ) | mysql ...
猜你喜欢
  • 2018-02-24
  • 2014-03-12
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多