Php 在mysql中以BLOB或普通文件的形式存储图像是否更节省内存?

Php 在mysql中以BLOB或普通文件的形式存储图像是否更节省内存?,php,mysql,performance,lamp,Php,Mysql,Performance,Lamp,我有一个256MB内存的LAMP服务器(云中的穷人服务器)。我有一个写在这台机器上运行的应用程序。目前人们上传图片,然后直接以BLOB的形式进入mysql 有人担心这可能是非常消耗内存的操作,我们将其转移到简单的普通文件。有人能告诉我这些担心是否正确吗?(考虑到我们在未来6个月内将有足够的RAM,是否值得努力改变已经编写的大量ode?) 一般来说,什么时候应该将图像存储在数据库中,什么时候作为文件存储 在MySQL中读取所需的BLOB(它被复制到多个缓冲区中) 因此,是的,在MySQL中读取BL

我有一个256MB内存的LAMP服务器(云中的穷人服务器)。我有一个写在这台机器上运行的应用程序。目前人们上传图片,然后直接以BLOB的形式进入mysql

有人担心这可能是非常消耗内存的操作,我们将其转移到简单的普通文件。有人能告诉我这些担心是否正确吗?(考虑到我们在未来6个月内将有足够的RAM,是否值得努力改变已经编写的大量ode?)


一般来说,什么时候应该将图像存储在数据库中,什么时候作为文件存储

MySQL
中读取所需的
BLOB
(它被复制到多个缓冲区中)


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

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


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

如果它用于在网页上提供服务,我将使用纯文件系统,并在数据库中以文本格式链接到图像文件名。Apache和浏览器通常在缓存静态文件方面做得非常出色


尽管从理论上讲,从数据库中为图像提供服务可以获得类似的性能,但由于我能想到的唯一优势是更具凝聚力的数据库(通过一个简单的数据库转储,您可以获得所有数据:图像+数据),因此您需要为其做的大量工作并不能证明此选择的合理性.

出于以下几个原因,您应该将它们存储在文件系统中:

  • 通过其他应用程序(shell、FTP、www等)可以轻松访问图像
  • 从文件系统中读取它们比从数据库中读取更少的资源密集型(包括内存)
  • 如果数据库损坏,则图像是安全的
  • 您也不会让表碰到它们的大小限制(由操作系统文件大小限制决定),这会减慢它们的速度(并使它们需要更多的资源来读取)
<> P>在DB中存储图像的唯一时间是当它们在事务处理中使用时,甚至在存储文件系统时有很多处理方法。

总结:

数据库存储:

优点:

  • 确保引用完整性
  • 更简单的备份策略
  • 更简单的集群(数据库集群)
缺点:

  • 内存使用和存储成本更高
  • 难以衡量
  • 必须编写其他代码以支持HTTP缓存
  • 需要数据库和关联的查询代码
文件系统存储

优点:

  • 内存占用率低(效率更高
  • 存储大小等于文件大小
  • 易于检索和存储
  • 允许web服务器控制缓存
缺点:

  • 引用完整性没有保证
  • 备份并不总是与数据库备份同步
  • 需要额外的备份策略
如果图像的引用完整性很重要,请将其存储在数据库中。其优点是,数据库备份始终意味着您的行和图像是同步的。这确实意味着存储和检索资源的成本要高一些

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

我个人总是将它们存储在数据库中。对我来说,回报大于成本。但情况并非总是如此,您应该查看您的应用程序需求,看看哪个最适合您


一些大型网站正在使用blob存储其网站内容。Flickr对blob的使用实际上有很好的文档记录。不过,为了回答您的问题,文件存储比数据库存储更节省内存。

,这是一个非常具体且可回答的问题:“哪种方式更节省内存”。这不是这里提到的任何其他问题的重复。我的问题是关于内存消耗。总是很高兴知道为什么有人不同意。我的帖子相当中立,陈述了两者的优缺点。。。那为什么要投反对票?我没有投反对票。但是,OP最有可能使用MyISAM,因此在该存储类型中无法确保引用完整性。我也得到了一个,没有任何注释。。似乎有人在做战略性的向下投票。你说了“三次”。并非我怀疑你,但如果你能证实这一点,我将非常高兴。:)MySQL的查询缓冲区,当数据从MySQL->script通过线路发送时,PHP自己的内存,当数据从database object->userland和Web服务器自己的输出中被回送并可能在内部复制时buffer@Marc:没有,MySQL中只有三个缓冲区:)@Akshar:请看我帖子中的链接。缓存是我脑海中一个重要的东西。但是apache是否知道文件是从文件系统还是从数据库?很可能来自db。@Akshar:当然知道<代码>example.org/file.jp