处理MySQL中的大型Blob数据?

7

如何将大型BLOB插入MySQL数据库(InnoDB)?

根据MySQL手册,LONGBLOB类型的字段支持高达4 GB的数据大小。但是,这么大的数据如何进入数据库呢?

我尝试使用以下方法:

INSERT INTO table (bindata) VALUES ( LOAD_FILE('c:/tmp/hugefile') );

如果hugefile的大小超过500 MB,该操作将失败。我已经将max_allowed_packet设置为适当的大小;innodb_buffer_pool_size的值似乎没有影响。

我的服务器运行Windows Server 2003,有2 GB RAM。我正在使用MySQL 5.0.74-enterprise-nt。


只因为你能做到,并不意味着你应该这么做。 - Kekoa
4
我知道在某些环境中,将文件存储在文件系统中比存储在数据库中更好,但无论讨论如何,我必须了解如何以这种方式存储数据,以便能够尝试并形成有关两种解决方案(存储在文件系统和存储在数据库中)的优缺点的意见。预先感谢您的理解! - oli_arborum
2个回答

2

BLOBs被缓存在内存中,这就是为什么在将其插入到数据库时会有3个BLOB的副本。

您的500 MB BLOB占用了1,500 MB的RAM,似乎已经达到了您的内存限制。


1
我需要一台64位机器,内存大于12GB,才能插入4GB的BLOB吗? - oli_arborum
@oli_arborum:看起来是这样。在这里看看:http://www.mysql.com/news-and-events/newsletter/2003-09/a0000000237.html - Quassnoi
MySQL支持BLOB(二进制大对象),这意味着您可以将任何二进制文件存储到MySQL中。许多人问,MySQL中BLOB的最大大小是多少。在MySQL 4.0中的理论限制为2G,但是每个BLOB通常需要在内存中有3个副本(存储在各种缓冲区中),因此如果您在MySQL中存储大型BLOB,则需要大量内存。这就是为什么理论限制只能在64位系统上达到的原因。实际限制约为每个BLOB几百兆字节。 - cachius
仍然在线于邮件列表档案 http://nyphp.org/pipermail/talk/2003-September/005737.html。 - cachius

1

我不知道你使用哪个客户端/ API,但是当尝试从自己的Java和Objective-C客户端使用blob时,似乎MySQL并不真正支持流式传输blob。您需要足够的内存将整个blob作为字节数组保存在RAM中(服务器和客户端端),而且可能需要多次保存!转移到64位Linux有所帮助,但这不是理想的解决方案。

MySQL不适用于BLOB处理(对于小型BOB来说还可以:-)。它占用两到三倍的RAM才能存储/读取“BLOB”。

您必须使用其他数据库(如PostgreSQL)才能获得真正的BLOB支持,抱歉。


为了避免客户端需要sizeof(BLOB)的RAM,我使用了mysql命令行客户端和LOAD_FILE()函数,这只使用服务器的RAM。 - oli_arborum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接