一般来说,存成JSON和大对象最主要的区别在于,使用内嵌binary,该对象会成为记录的一部分,并且在每次访问的时候必须读取完整记录进入内存。
如果该部分长度较小性能会ok,但是如果太长可能会造成过多的二进制数据和检索元数据字段混杂在一起,反而会对IO性能产生影响。
使用大对象的优点则是检索元数据和二进制数据分割。在数据量较小或二进制数据长度不大的情况可能性能弱于嵌入记录内部的方式,但是当数据量大于内存时,如果检索元数据小于内存则可以确保需要随机检索的数据驻在内存中,只有当访问大对象字段的时候才需要物理IO,这种方式会对整体吞吐量有提升。
具体的阀值可以在你的系统里进行一些简单测试。
另外,大对象支持seek功能,可以分批读取数据(譬如一个大视频没有必要每次读取全部进内存,可以每次读取几秒钟,然后播放完成后读取下几秒钟的数据)。
对于最后一个问题,BASE64会增加发送字符串的长度,这个是JSON标准决定的,因为JSON标准不支持二进制传输,所以展现和输入时必须转化为纯字符串的BASE64。