Php 在mysql中以BLOB或普通文件的形式存储图像是否更节省内存?
我有一个256MB内存的LAMP服务器(云中的穷人服务器)。我有一个写在这台机器上运行的应用程序。目前人们上传图片,然后直接以BLOB的形式进入mysql 有人担心这可能是非常消耗内存的操作,我们将其转移到简单的普通文件。有人能告诉我这些担心是否正确吗?(考虑到我们在未来6个月内将有足够的RAM,是否值得努力改变已经编写的大量ode?)Php 在mysql中以BLOB或普通文件的形式存储图像是否更节省内存?,php,mysql,performance,lamp,Php,Mysql,Performance,Lamp,我有一个256MB内存的LAMP服务器(云中的穷人服务器)。我有一个写在这台机器上运行的应用程序。目前人们上传图片,然后直接以BLOB的形式进入mysql 有人担心这可能是非常消耗内存的操作,我们将其转移到简单的普通文件。有人能告诉我这些担心是否正确吗?(考虑到我们在未来6个月内将有足够的RAM,是否值得努力改变已经编写的大量ode?) 一般来说,什么时候应该将图像存储在数据库中,什么时候作为文件存储 在MySQL中读取所需的BLOB(它被复制到多个缓冲区中) 因此,是的,在MySQL中读取BL
一般来说,什么时候应该将图像存储在数据库中,什么时候作为文件存储 在
MySQL
中读取所需的BLOB
(它被复制到多个缓冲区中)
因此,是的,在
MySQL
中读取BLOB
比读取文件消耗更多的内存。如果有很多文件需要跟踪,或者它们非常大,我会将它们存储为文件。特别是如果这些文件是通过web访问的,在这种情况下,您可以从SQL server卸载所有这些工作,并让web服务器处理传输
跟踪图像的一个好方法是使用主键命名图像,然后跟踪数据库中的原始文件名(如果需要)。通过这种方式,您可以始终知道哪个文件连接到哪个行。此外,如果你有许多文件(数千,数百万,…),你可能会考虑将它们“散列”到目录中,因此1-1000存储在/1,1001-2000 ARES中存储在/2中,等。当您在一个目录中获取大量文件时,某些操作系统会看到一些速度减慢。如果它用于在网页上提供服务,我将使用纯文件系统,并在数据库中以文本格式链接到图像文件名。Apache和浏览器通常在缓存静态文件方面做得非常出色
尽管从理论上讲,从数据库中为图像提供服务可以获得类似的性能,但由于我能想到的唯一优势是更具凝聚力的数据库(通过一个简单的数据库转储,您可以获得所有数据:图像+数据),因此您需要为其做的大量工作并不能证明此选择的合理性.出于以下几个原因,您应该将它们存储在文件系统中:
- 通过其他应用程序(shell、FTP、www等)可以轻松访问图像
- 从文件系统中读取它们比从数据库中读取更少的资源密集型(包括内存)
- 如果数据库损坏,则图像是安全的李>
- 您也不会让表碰到它们的大小限制(由操作系统文件大小限制决定),这会减慢它们的速度(并使它们需要更多的资源来读取)
总结:
数据库存储: 优点:- 确保引用完整性
- 更简单的备份策略
- 更简单的集群(数据库集群)
- 内存使用和存储成本更高
- 难以衡量
- 必须编写其他代码以支持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