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