不管是用文件系统还是用 sqlite 存储聊天记录,本质区别是如何在一个大段的 block 存储上,存取大量的短数据,这才是根本区别。至于怎样索引,用什么算法搜索,两种方案基础之上都可以实现,那不是问题的关键。
用文件系统直接存储的问题是,文件系统是一个系统级公有设施。它要满足的是整个 OS 层面的通用需求,而不是某个单进程、某个业务场景的最优访问模式。所以如果把大量业务对象直接映射成普通文件,单文件的存取就会引入额外开销。当然现代文件系统已经把性能压榨到极限了,但抽象层级决定了它不可能专门为聊天记录这种大量短数据场景优化。每一个文件的打开,都可能涉及路径解析、目录查找 、inode 加载、权限检查、句柄管理、元数据更新等等文件系统开销,然而这对于聊天记录的存取场景完全是不必要的。
相比之下,sqlite 建立在文件系统之上,存取操作损耗低了很多,检索实现起来也更加容易。
不过如果仅讨论每一个聊天会话写一个文件这样的使用场景,一般用户顶多几百几千个聊天会话,这种量级下性能差距微乎其微,用啥都行。
我真正想吐槽的是,之前微信 Mac 版本把表情包、缩略图这种小数据也一概全部单文件塞文件系统,我的聊天记录不算特别多,微信的数据文件夹下都有上几十万个小文件,虽然用着没啥问题,但是对于系统备份、恢复、迁移操作都是灾难,90% 的时间浪费在小文件处理上。我记得某次测试,单 rm -Rf 删微信数据,就删了好几个小时,微信自己的聊天迁移如此缓慢,我猜也是同一个原因。4.0 新版本应该已经修了这个问题。