我正在编写一个将上传和删除许多文件的应用程序,我通常只是将文件移动到服务器中的文件夹,并使用行id
命名。但据我所知MySQL还允许我存储二进制数据(文件)何时这是一个更好的选择?。
P.S:如果重要的话,我正在使用MyISAM。请使用固定参数,例如When 使用BLOB会意味着性能 改进?
感谢。
更新
相关问题:
- Storing Images in DB - Yea or Nay?
- To Do or Not to Do: Store Images in a Database(感谢塞巴斯蒂安)
更新2
将文件存储在数据库中 不需要我想知道什么时候 这比存储更好 他们在文件夹中。
答案 0 :(得分:13)
读:
总结
如果您有时需要检索一个 图像,它必须可用 几个不同的Web服务器。但是我 认为这就是它。
- 如果不必提供 几台服务器,它总是更好 把它们放在文件系统中。
- 如果有的话 可在多台服务器上使用 实际上有一些负载 系统,你需要某种 分布式存储。
答案 1 :(得分:9)
如果您使用的是MyISAM数据库引擎,则可以对BLOB字段建立索引,以便您可以使用数据库快速搜索文件。
在BLOB字段中存储文件的另一个好处是,它们可以比磁盘上的文件更有效地访问(不需要目录遍历,打开,读取,关闭)。
如果您计划在MYSQL中存储大量文件,将文件存储在单独的表中通常是一种很好的做法。这允许您扫描元信息而不会绊倒blob。然后,当你真正需要获取blob时,JOIN就足够了。
答案 2 :(得分:2)
嗯,这有点旧,但是本文为BLOB存储提供了一些不错的参数:http://www.dreamwerx.net/site/article01。
虽然不是性能提升本身,但是在数据库中而不是在目录中使用您的图像和诸如此类的东西也应该消除热链接问题(假设这是一个公开可用的Web应用程序)。
答案 3 :(得分:0)
您是否一定要使用MySQL?如果没有,请尝试使用ODBMS或PostgreSQL来存储文件,或者只存储文件的路径。例如,请参阅this。
答案 4 :(得分:0)
Memcache不是替代解决方案,因为您需要跨分布式服务器管理冗余和TTL,这使得维护更加困难。
我认为更好的解决方案是将公共静态数据放在CDN上,该CDN由设计和私有静态数据在DB上分发,以便于跨多个服务器分发。
每个服务器都可以在每次点击时实现自己的Memcache。
如果您已经将数据存储在文件系统中并且想要将其迁移到数据库中,最简单的方法是创建以下的键值表:
KEY ='/ image / filename'(文件系统位置的字符串),value = BLOB(实际文件)并构建一个包装器,它将在重写规则和应用程序处理的帮助下从数据库中获取。这样,您就可以对现有代码使用完全透明。