【问题标题】:Is it more memory efficient to store images in mysql as BLOB or as plain files somewhere?将图像作为 BLOB 或纯文件存储在 mysql 中的内存效率更高吗?
【发布时间】:2010-09-08 18:13:22
【问题描述】:

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

有人担心这可能是非常消耗内存的操作,我们将其移至简单的纯文件。有人能告诉我这些担忧是否有效吗? (鉴于我们将在未来 6 个月内拥有足够的 RAM,是否值得努力更改已经编写的大量 ode?)

一般来说,我们应该何时将图像存储在数据库中,何时存储为文件?

【问题讨论】:

标签: php mysql performance lamp


【解决方案1】:

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

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

【讨论】:

  • 我也得到了一个,没有任何评论。。似乎有人在进行战略性的投票。
  • 你说的是“三次”。不是我怀疑你,但如果你能证实这一点,我会很高兴。 :)
  • MySQL 的查询缓冲区,当数据从 mysql-> 脚本通过线路发送时,PHP 自己的内存,而数据被回显并可能在内部从数据库对象-> 用户域复制,以及网络服务器的自己的输出缓冲区
  • @Marc: 不,这只是MySQL 内的三个缓冲区:)
  • @Akshar:查看我帖子中的链接。
【解决方案2】:

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

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

您应该考虑将图像存储在数据库中的唯一情况是当它们用于事务处理时,即便如此,在文件系统中存储时也有许多解决方法。

【讨论】:

    【解决方案3】:

    总结一下:

    数据库存储:

    优点:

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

    缺点:

    • 内存使用和存储成本更高
    • 难以扩展
    • 必须编写额外的代码来支持 HTTP 缓存
    • 需要数据库和相关的查询代码

    文件系统存储

    优点:

    • 内存占用少(更高效
    • 存储等于文件大小
    • 易于检索和存储
    • 允许 Web 服务器控制缓存

    缺点:

    • 无法保证参考完整性
    • 备份并不总是与数据库备份同步
    • 需要额外的备份策略

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

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

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

    一些大型网站正在使用 BLOB 来存储其网站内容。 Flickr 对 BLOB 的使用实际上是有据可查的。不过,要回答您的问题,文件存储比数据库存储更节省内存

    【讨论】:

    • 总是很高兴知道为什么有人不同意。我的帖子非常中立,并说明了两者的优缺点……那为什么要投反对票呢?
    • 我没有投反对票。但是,OP 很可能使用 MyISAM,因此在该存储类型中无法确保引用完整性。
    【解决方案4】:

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

    即使在理论上,您可以从数据库中获得类似的性能,但您需要为它做的工作量并不能证明这种选择是合理的,因为我能想到的唯一优势是更具凝聚力 数据库(通过简单的 DB 转储,您可以获得所有数据:图像 + 数据)。

    【讨论】:

    • 缓存确实是我想到的一件重要的事情。但是apache是​​否知道文件来自文件系统还是数据库? example.org/file.jpg 很可能来自 db。
    • @Akshar:它当然知道。 example.org/file.jpg 将首先通过 mod_rewrite 将其映射到 example.org/serve-db-file.php 或类似的东西。当然,这一切都在Apache 之内。
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2013-07-19
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多