我正在努力决定是否应该在即将开展的项目中使用MySQL blob字段类型.
我的基本要求是,可以查看某些数据库记录,并将多个文件上传并"附加"到这些记录中.看到所述记录可以根据具体情况限于某些人.任何类型的文件都可以上传,几乎没有任何限制.
所以从一个方面看,如果我走MySQL路线,我不必担心病毒的爬行或随机的php文件上传和以某种方式执行.我还有一个更容易的许可路径,并保持数据与记录接近.
另一个明显的途径是将数据存储在webroot之外的特定文件夹结构中.在这种情况下,我必须为文件夹/文件提出一个特殊的命名约定,以跟踪它们在数据库中引用的内容.
使用MySQL blob字段类型是否会影响性能?我担心选择一个会阻碍网站未来发展的解决方案,以及选择一个不易维护的解决方案.
使用MySQL blob字段类型是否会影响性能?
本质上不是,但如果你有大BLOB阻塞你的表和内存缓存肯定会导致性能损失.
另一个明显的途径是将数据存储在webroot之外的特定文件夹结构中.在这种情况下,我必须为文件夹/文件提出一个特殊的命名约定,以跟踪它们在数据库中引用的内容.
是的,这是一种常见的方法.您通常会执行类似于与每个表关联的文件夹命名的文件夹,其中包含仅基于主键的文件名(理想情况下为整数;当然不会是用户提交的任何内容).
这是一个更好的主意吗?这取决于.只有一个数据存储有简单的部署优势,而且不必担心让Web用户对任何东西进行写访问.此外,如果可能有多个应用程序副本正在运行(例如,主动 - 主动负载平衡),那么您需要同步存储,这对于数据库而言比使用文件系统更容易.
如果您确实使用的是文件系统而不是blob,那么问题是,您是否通过将Alias指向该文件夹来获取Web服务器?
+超级快
+缓存好
- 额外的服务器配置:虚拟目录; 需要适当的文件扩展名才能返回所需Content-Type
- 额外的服务器配置:需要添加Content-Disposition: attachment
/ X-Content-Type-Options
标头来阻止IE嗅探HTML作为反XSS措施的一部分
或者你是否通过服务器端脚本将其吐出来手动提供文件,因为你必须从MySQL blob提供服务?
- 可能很慢
- 需要一些手动的If-Modified-Since和ETag处理来正确缓存
+可以使用应用程序自己的访问控制方法
+易于从服务脚本添加正确的Content-Type和Content-Disposition标头
这是一个权衡,没有一个全球公认的答案.
如果您的Web服务器将通过Web提供这些上载的文件,那么如果它们存储在文件系统上,性能几乎肯定会更好.然后,Web服务器将能够应用HTTP缓存提示Last-Modified
,ETag
这将有助于多次访问同一文件的用户的性能.此外,Web服务器将Content-Type
在服务时自动为文件设置正确的.如果您将blob存储在数据库中,那么当您从Web服务器免费获取这些功能时,您将最终实现上述功能.
此外,从数据库中提取大型blob数据可能最终成为数据库的性能瓶颈.此外,您的数据库备份可能会更慢,因为它们将备份更多数据.如果您在开发期间进行临时查询,那么在select
语句的结果集中看到大blob会很不方便.如果您只想检查上传的文件,那么这将是不方便和迂回的,因为它将被笨拙地存储在数据库列中.
我会坚持将文件存储在文件系统上的常见做法以及数据库中文件的路径.
根据我的经验,在MySQL中存储BLOB是可以的,只要您将blob存储在一个表中,而其他字段存储在另一个(连接)表中.相反,在具有几个标准字段的表的字段和具有100 MB数据的一个blob字段中搜索可以显着减慢查询.
我不得不为这个问题更改邮件应用程序的数据层,其中电子邮件与发送日期,电子邮件地址等相同的表中存储内容.搜索10000封电子邮件需要9秒.现在需要采取的措施;-)