在 mysql 中导入 70MB 的 csv 文件大约需要 70 小时?

Posted

技术标签:

【中文标题】在 mysql 中导入 70MB 的 csv 文件大约需要 70 小时?【英文标题】:Importing 70MB csv file taking around 70 hours in mysql? 【发布时间】:2014-12-19 17:08:47 【问题描述】:

我正在尝试导入 70MB 的 csv 文件(如果有任何区别,请使用空格分隔) 它由大约 600 万行组成,每行包含 2 个数字(2 列)。

导入 1 MB 的文件大约需要 1 小时,该文件大约有百万行。 我尝试使用 phpmyadmin (CSV) 的导入功能,也尝试使用 Bigdump,但两者几乎都花费了相同的时间。

我担心的是,一个简单的 70 MB 文件怎么会需要这么长时间(2 天半)才能加载到数据库中?那么,如果导入本身需要这么长时间,那么使用数据库有什么意义呢?

我设置了 max_memory_size = 1280 MB,所以我认为 70mb 的文件没有任何内存问题。我在我的本地主机上做,我也在我部门的服务器上试过。即使使用 bigdump.php 也需要相同的时间并且没有网速问题

【问题讨论】:

前缀m表示milli或10^-3,mega请使用M。另外b 表示bits,请使用B 表示bytes。目前你在谈论毫比特...... phpMyAdmin 很慢。请改用命令行。这是一个教程chriseiffel.com/everything-linux/… 这确实太慢了。我经常在几分钟内将多 GB 的数据文件导入 mysql。您可能正在使用非常慢的磁盘,或者 MySQL 缓冲区和日志大小不足,或者两者兼而有之。 MySQL 需要对配置设置进行一些更改。见percona.com/blog/2014/01/28/… 或tocker.ca/2013/09/17/… 实际花费的时间是什么:插入数据库本身或上传内容的总时间?请记住,文件首先需要完全上传,这可能需要在上传速度为 500Kbits 的普通异步 DSL 上花费一些时间。 @BillKarwin 先生,实际上我的问题与 OP 相同,您的评论似乎有一个隐藏的答案。这就是我使用 cmets 的原因。但是,我已经解决了我的问题,您的评论帮助很大。我将缓冲区大小增加到 2G,现在导入速度很快。这是您在 mysql 提示符下的命令:- mysql> SET GLOBAL innodb_buffer_pool_size=2147483648; 【参考方案1】:

批量插入可以通过禁用某些检查来提高效率,并使用在导入时显着加快的 LOAD DATA;例如

SET autocommit=0;
SET unique_checks=1;
SET foreign_key_checks=0;

  LOAD DATA INFILE myfile.txt ESCAPED BY ' '
  INTO TABLE mytable

SET unique_checks=1;o
SET foreign_key_checks=1;
COMMIT

可以找到更多信息;

http://dev.mysql.com/doc/refman/5.1/en/load-data.html http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

需要这么长时间,您可能需要调查潜在问题。

创建一个空的 MyISAM 表并将该数据导入其中?这明显更快吗?如果是这样,您可能有一个次优配置的 innodb 数据库。 使用 MyISAM 表检查 INSERT INTO FROM SELECT 查询的性能,确保禁用文本,如果这仍然很慢,那么您几乎肯定有磁盘 io 问题。

【讨论】:

以上是关于在 mysql 中导入 70MB 的 csv 文件大约需要 70 小时?的主要内容,如果未能解决你的问题,请参考以下文章

sql 在MySQL中导入CSV文件

在 ORacle 10g 中导入 MySql 生成的 csv 大文件

如何使用 if else 条件在 php mysql 数据库中导入 csv 数据

如何在 phpmyadmin MySql 中导入记事本 .txt 文件

Mysql从脚本导入

在 hsqldb 中导入 csv 文件