在 mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方法是啥,为啥?

Posted

技术标签:

【中文标题】在 mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方法是啥,为啥?【英文标题】:What is the best way to store Binary data (images, pdf's, mp3's, videos ect) in mysql and why?在 mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方法是什么,为什么? 【发布时间】:2011-03-06 18:36:06 【问题描述】:

mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方式是什么?为什么?我很想知道你是怎么做的(作为开发人员),为什么?还有大网站是怎么做的?

提前谢谢你;-)

【问题讨论】:

为什么要标记为 Oracle? 我认为这是一个一般的 rdbms 问题 但是您的问题是“在 mysql 中”而不是“在数据库中”!实际上,这是不同 DBMS 倾向于以不同方式做的事情。 【参考方案1】:

我只会使用数据库来存储文件元数据(大小、MIME 类型、标签等)。为了数据的完整性和安全性,我最好将处理二进制数据的工作交给一个专门的服务,比如Amazon's S3。

关于数据完整性:我会通过执行涉及大 blob 的事务来避免数据库服务器过载。相反,我建议先存储文件并执行一些定期异步“垃圾收集”。

【讨论】:

【参考方案2】:

好吧,我将图像保存在磁盘上,我有很多很多,我不想想象这可能是维护的噩梦。到目前为止,我的数据库 (mysql) 小于 5GB,我对大约 50GB 的 jpeg 文件很好(每个图像都保存了几个大小)。 如果操作正确,将图像存储在单独的数据库中(可能带有单独的 RAID 控制器)可能是一件好事,但我相信系统可以更快地将它们存储在磁盘上。

【讨论】:

【参考方案3】:

我没用过PBMS存储引擎,不过貌似有路要走:

Blob streaming

【讨论】:

【参考方案4】:

在 Oracle 中,我会使用 BLOB 列来存储此类对象。这样,数据的完整性和安全性就与所有其他数据一样得到保证。另一种方法是使用 BFILE,它是指向外部文件系统上文件的指针 - 当您下次尝试访问该文件时,该文件可能已被移动、删除、修改甚至丢失。

【讨论】:

+1 在构建网站时必须同时处理 BLOB 存储和文件系统指针,我更喜欢在提供服务之前以文件系统缓存为前端的 BLOB 存储。【参考方案5】:

在 MySQL Blob 中存储二进制数据可以使用:MySQL Manuel: 10.4.3. The BLOB and TEXT Types

虽然如果不是真的有必要,我不会将二进制数据存储在数据库中,因为在 MySQL 等中存储数据的主要原因(如 Join、Index 等)很难与这些数据一起使用类型。 Blob 还会降低整体数据库性能。

也许您为存储多个方面和文件系统路径的文件构建一个单独的表...

【讨论】:

我不知道,我见过存储在 Oracle 数据库中的 TB 级二进制数据,然后从其中流式传输。这不一定是个坏主意。 我没有写到这通常是一个坏主意 - 有支持和反对 Blob 的示例和用例。尽管如此,在我看来,当有人想要使用此类技术时,应该有充分的理由和正确的调整(例如,分离的表空间,...)。 BLOB 是要走的路。存储路径有一些明确的问题。如果文件被移动,则您的指针已损坏。备份数据库变得相对没有意义。对数据的可用操作并不能决定存储它的特性。

以上是关于在 mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方法是啥,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTML jQuery 和 Java 在 mySQL DB 中存储 PDF

使用 PHP 生成 PDF 文件(包括 PNG 图像)

将图像文件存储在猫鼬模式中的二进制数据中并以 html 形式显示图像

从 mysql 数据库中检索图像时引发异常

Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)

JDBC处理mysql大数据