将图像作为BLOB或纯文件存储在某个地方是否更高效?

时间:2010-09-08 18:13:22

标签: php mysql performance lamp

我有一个拥有256MB RAM的LAMP服务器(云中的穷人服务器)。我有一个应用程序编写在这台机器上运行。目前人们上传图像,他们直接进入mysql作为BLOB。

有人担心这可能是非常耗费内存的操作,我们将其转移到简单的普通文件。有人可以告诉我这些问题是否有效? (考虑到我们将在未来6个月内拥有足够的内存,我们是否会努力改变已经写好的颂歌?)

作为一般规则,我们应该何时将图像存储在数据库中以及何时作为文件存储?

5 个答案:

答案 0 :(得分:15)

要阅读BLOB中的MySQL,您需要three times as much memory as it takes(它会被复制到多个缓冲区中)。

是的,在BLOB中阅读MySQL比阅读文件消耗的内存更多。

答案 1 :(得分:8)

您应该将它们存储在文件系统中,原因如下:

  • 可以通过其他应用程序(shell,FTP,www等)轻松访问图像,
  • 从文件系统读取资源比从数据库中读取资源要少(包括内存
  • 如果数据库损坏,图像是安全的。
  • 您也不会遇到表格大小限制(由操作系统文件大小限制决定),这会减慢它们的速度(并使它们需要更多资源来阅读)。

您应该考虑在数据库中存储图像的唯一时间是在事务处理中使用它们时,即使这样,存储在文件系统中时也会有很多解决方法。

答案 2 :(得分:6)

总结:

数据库存储:

优点:

  • 确保参照完整性
  • 更轻松的备份策略
  • 更容易的群集(数据库群集)

缺点:

  • 内存使用和存储成本增加
  • 难以扩展
  • 必须编写其他代码以支持HTTP缓存
  • 需要数据库和关联的查询代码

文件系统存储

优点:

  • 内存占用率低(效率更高
  • 存储空间等于文件大小
  • 轻松检索和存储
  • 允许Web服务器控制缓存

缺点:

  • 参照完整性无法保证
  • 备份并不总是与数据库备份同步
  • 需要其他备用策略

如果图像的参照完整性很重要,请将它们存储在数据库中。优点是备份数据库始终意味着您的行和图像是同步的。它确实意味着存储和检索的资源更加昂贵。

如果图像本身不重要,请将它们存储为文件。它允许快速和简单的检索和存储。但是,使用文件的缺点是备份策略变得更加复杂,并且您的文件并不总是与数据库行同步。

我个人总是将它们存储在数据库中。对我来说,奖励比成本更高。 虽然并非总是如此,但您应该查看您的应用程序要求,看看哪种方法最适合您。

一些大型网站正在使用BLOB存储其网站内容。 Flickr对BLOB的使用实际上有很好的记录。但要回答你的问题,文件存储比数据库存储更节省内存

答案 3 :(得分:1)

如果是在WebPage上提供服务,我会使用纯文件系统,在DataBase上以文本格式链接到图像文件名。 Apache和浏览器通常在缓存静态文件方面做得非常出色。

尽管从理论上讲,你可以从数据库中获得类似的性能服务,但是你需要做的工作量并不能证明这一选择是合理的,因为我能想到的唯一优势是更强大的凝聚力数据库(使用简单的数据库转储可以获得所有数据:图像+数据)。

答案 4 :(得分:0)

如果你有很多要跟踪的文件,或者它们非常大,我会将它们存储为文件。特别是如果要通过Web访问这些文件,在这种情况下,您可以从SQL服务器卸载所有这些工作,并让Web服务器处理传输。

跟踪图像的一种好方法是使用主键命名它们,然后在数据库中跟踪原始文件名(如果需要)。这样,您始终可以知道哪个文件连接到哪一行。此外,如果您有许多文件(数千,数百万......),您可能会考虑将它们“散列”到目录中,以便1-1000存储在/ 1中,1001-2000存储在/ 2中等等。当你在一个目录中获得大量文件时,操作系统看起来有点慢。