在 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
将图像文件存储在猫鼬模式中的二进制数据中并以 html 形式显示图像