好的,我已经对此进行了搜索并阅读了一些关于在 [MySQL] 数据库中存储二进制数据的观点。一般来说,我认为这是一个坏主意并尽量避免它,支持传统的文件传输,并且只是将文件的引用存储在数据库中。
但是,我正在处理一个需要与远程/云数据库同步的项目,不仅用于文件,还用于设置和其他用户内容。由于这个和其他原因,我觉得这可能是数据库中二进制存储的合适情况。
我为数据库同步编写了一个通用系统,该系统使用反射和 XML 运行良好。我还(违背我的直觉)将文件存储集成到该系统中。再次,它运行良好 - 我将文件切成 64Kb BLOB 并将它们存储在一个表中,并带有一个 file_id 引用(链接到一个单独的表,其中包含文件名/大小/mime 类型等元数据)。
这使我能够在连接可用时发送点点滴滴,并且还允许我限制每个请求的大小以保持事情顺利进行。
到目前为止,我还没有发现任何问题,并且已经成功地在两个方向上导入和传输了超过 1gb 的数据(超过大约 10-15 个文件/16000 行),但我担心它的可扩展性 - 一旦有它会变慢那里有 20gb+ 的数据,或者如果我的查询结构良好,MySQL 可以处理它吗?
我决定将数据存储在数据库中的另一个原因是,我认为如果空间不足,我可以简单地向 MySQL 添加另一个 HDD/存储设备,以期实现有效的扩展/复制/等。
我非常感谢任何关于这是一种好方法还是坏方法的观点或评论,我是否错过了在生产环境中使用后可能会看到的任何明显问题?
编辑:我忘了提,文件大小可以从 1KB 到 ~1GB
[粗略]结论 首先:非常感谢那些提供深思熟虑的答案的人。在这里选择公认的答案非常困难,因为每个人都有一些不错的东西可以提供。
最后(尽管我有希望),我已经决定纯 MySQL 存储服务器充其量只是一个好的解决方案(我仍然不禁想知道为什么他们会打扰包括 BLOB 类型)。
作为替代方案,我在@Nick Coons 文件系统方法和@tadman 建议使用轻量级键/值数据库引擎(如leveldb)的混合体之间纠结。如果在这个项目中使用 leveldb 的实用性不是问题,这很可能是我将努力的方法。
在此基础上,我接受了 tadman 的回答;他的回答对我的情况也最适用和最有用。
话虽如此,对于那些感兴趣的人来说:到目前为止,我仅使用 MySQL 就取得了相当大的成功。我已经测试了一个存储超过 15gb 二进制数据的表,从大表中插入/检索数据(通过仔细查询)没有任何明显的负面影响。但是,我确信这仍然非常低效,并且提到的任何一种替代方法都会明显更好。