可以在文件中加载数据(mysql批量上传)读取压缩文件吗?

时间:2012-06-11 21:19:36

标签: mysql

我想要加载到mysql中的大型xml文件。它的大约20 GB是未压缩的,但我认为我可以将其压缩到原始大小的25%左右,然后将其批量上传到压缩表中。

我知道我可以压缩数据库本身的数据但是它可以在批量添加过程中读取压缩文件吗?

编辑:通过压缩我不是指它的.gz.tar文件或任何东西。我的意思是当我用Java或C ++创建文件时,我将其输出为gzip,因此文件本身是.csv或.xml并保留正确的结构,但其中的项目(每行)都被压缩。 / p>

如果这是不可能的,我可以做一些像批量上传这样的东西,但不知何故通过解压缩内容的程序过滤它?我想在C中打开文件并在将其加载到mysql时压缩它。问题是我想在批量插入中执行此操作,而不是数百万个单独插入。

3 个答案:

答案 0 :(得分:8)

您应该明确地使用LOAD DATA INFILE。插入可能比LOAD DATA INFILE慢一个数量级,特别是在较大的文件上。

不幸的是,MySQL本身并不支持直接加载压缩文件(据我所知,任何类型)。但是,如果你查看上面的LOAD DATA INFILE链接,有一个技巧可以直接将数据从管道加载到表中(只需在页面中搜索'pipe')。我想你可以解压缩文件并使用该方法将输出传递给MySQL,但压缩/解压缩显然比直接加载未压缩文件要慢。

答案 1 :(得分:5)

$ mkfifo --mode=0666 /tmp/namedPipe
$ gzip --stdout -d file.gz > /tmp/namedPipe

然后将未压缩的数据加载到MySQL表中,如下所示:

LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;

答案 2 :(得分:2)

请勿使用' - mode = -666'除非您希望系统上的每个其他用户都能够写入管道。使用' - mode = -600',并将管道保留在本地主目录中,以降低未经授权访问的风险。