【问题标题】:Handling of huge Blobs in MySQL?在 MySQL 中处理巨大的 Blob?
【发布时间】:2010-10-31 00:51:50
【问题描述】:

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

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

我尝试使用

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

如果大文件的大小大于大约 500 MB,则会失败。我已将max_allowed_packet 设置为合适的大小; innodb_buffer_pool_size 的值似乎没有影响。

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

【问题讨论】:

  • 你可以并不意味着你应该。
  • @kekoav 我知道在某些环境中,将文件存储在文件系统中比在数据库中更好,但是独立于这个讨论,我必须知道如何存储这样的数据才能能够尝试并就​​两种解决方案的优缺点(存储在文件系统中和存储在数据库中)形成意见。提前感谢您的理解!

标签: mysql blob


【解决方案1】:

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

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

【讨论】:

  • 所以我需要一台具有 >12GB RAM 的 64 位机器才能插入 4 GB BLOB?
  • @oli_arborum:好像是这样。见这里:mysql.com/news-and-events/newsletter/2003-09/a0000000237.html
  • "MySQL 支持 BLOB(Binary Large Objects),这意味着你可以将任何二进制文件存储到 MySQL 中。很多人问,MySQL 中 BLOB 的最大大小是多少。MySQL 4.0 中的理论限制是2G,但是每个blob通常需要在内存中有3个副本(存储在各种缓冲区中)所以你需要很多内存,如果你有大量的BLOB存储在MySQL中。这就是原因,为什么理论上的限制可以只能在 64 位系统上达到。实际限制是每个 BLOB 大约数百兆。” - 最后可用的 archive.org 快照 20100208201732
  • 仍在邮件列表存档nyphp.org/pipermail/talk/2003-September/005737.html在线。
【解决方案2】:

我不知道您使用哪个客户端/api,但是当尝试使用来自自己的 Java 和 Objective-C 客户端的 blob 时,MySQL 似乎并不真正支持 blob 流。您需要足够的内存来将整个 blob 作为字节数组多次保存在 ram(服务器和客户端)中!迁移到 64 位 linux 会有所帮助,但不是理想的解决方案。

MySQL 不是为 BLOB 处理而设计的(对于小型 BOB 来说还可以 :-)。它占用了要在“BLOB”中存储/读取的内存的两倍或三倍。

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

【讨论】:

  • 为了在客户端不需要 sizeof(BLOB) RAM,我使用了 mysql 命令行客户端和 LOAD_FILE() 函数,它只使用服务器的 RAM。
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2014-10-21
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多