MySQL大表导入

时间:2011-12-11 00:10:31

标签: mysql

我有一个1GB的sql文本文件,我正在导入MySQL。 我使用了一个'大文本文件查看器',可以看到它是一个std mysql表导出 - 从drop table开始,然后创建新表然后插入。注意:我也有表的csv。

我使用以下方法导入它:

  1. php.ini - upload_max_filesize,memory_limit和post_max_size(增加这些的大小,但仍然说它太大了 - 这些数字非常大 - 默认数字后为10个零)。

  2. C:\ wamp \ bin \ mysql \ mysql5.1.53 \ bin> mysqlimport -h localhost -u root -p --fields -t erminated-by ='\ t' - lines-terminated-by ='\ n' - 本地测试c:\ temp \ filename.csv

  3. 来源c:\ temp \ filename.sql

  4. 我可以看到“任务管理器”中的第二个2个方法似乎是在将整个1GB文件插入到MySQL之前将其移动到内存中。我可以看到每个进程,它会慢慢增长到超过1GB并因错误而失败。

    问题:导入表格是否有更好,最快的方法?有没有办法不需要将整个文件移动到内存中?我第一次使用这么大的sql表。

    THX

2 个答案:

答案 0 :(得分:1)

出现这么大的出口问题的一部分(大概)是由于其中的冗余。可能存在数千个“INSERT”命令,这些命令在一次加载时会占用大量内存。

如果您拥有与CSV完全相同的数据,我要做的是创建一个小的PHP脚本,逐行浏览CSV文件并动态创建INSERT sql查询然后执行它。这应该使内存占用率保持在非常低的水平,因为您可以在每次插入后继续替换临时变量的值(对应于字段)。

我已经链接到我尝试使用的功能。它被称为fgetcsv。该链接还有一些示例脚本,我认为这些脚本可能对您有用,这些脚本是由其他用户创建的。

祝你好运!

fgetcsv PHP function to use for the line-by-line read

答案 1 :(得分:0)

如果可以,请尝试不使用--local选项。

来自documentation

将LOCAL与LOAD DATA一起使用时,在服务器的临时目录中创建文件的副本。这不是由tmpdir或slave_load_tmpdir的值确定的目录,而是操作系统的临时目录,并且在MySQL服务器中不可配置。 (通常,系统临时目录在Linux系统上为/ tmp,在Windows上为C:\ WINDOWS \ TEMP。)此目录中的副本缺少足够的空间可能导致LOAD DATA LOCAL语句失败。

由于mysqlimport实用程序基本上是LOAD DATA INFILE语句的包装器,因此这也适用于您。