json
字段是怎么工作的?整个序列化成字符串后存储,然后查询的时候,从 json
字段从硬盘加载到内存,在数据库 Server
的 内存中,在整个反序列化吗?
如果这样的话性能会很差,因为序列化和反序列化是需要时间的,占时间有占 CPU 资源
json
字段是怎么融合到 B+
树中去的?
合理的方式因为是做按照 KEY:VALUE
的结构做特殊存储处理吧!
还有就是 MongoDB
是怎么处理这个问题的?
关于何时使用 json 字段,看到一个群友说的有一点点道理:
我在mysql里用json就是解决表新增列的问题。数据过多新增列,mysql会锁表停服,即便有tptools这种工具,运维也不愿意配合搞。所以如果新增的列不涉及索引,只是通过主键查到数据后输出这个属性,json是个好的选择
首先 MySql 里 JSON 字段的底层还是 blob,所以就是二进制字符串。(MySql 里字符串类型大体分两类,一类是“文本字符串”,另一类就是“二进制字符串”了)。
甚至 MySql 官方自己都明说了,这个字符串还是 utf8mb4 存储的:https://dev.mysql.com/doc/ref... ———— 不是字符串哪来的 utf8 一谈呢?
所以它是字符串这点没什么好怀疑的。
而 JSON 之所读操作比较快,是因为 MySql 采用了类似于 JsonPath 的语法、另外存储时 Key 有排序,所以 parser 可以在不用完整完全反序列化、而是仅仅反序列化所需要的字段的情况下完成工作,所以自然比你平常编程中用的那种 JSON 反序列化方法性能高很多。
总的来说就是并不存在什么你所谓的什么“融合”问题。
具体工作细节可以看这篇:https://cloud.tencent.com/dev... ,是腾讯云的云数据库团队总结的。
MongoDB 压根就不是 JSON,而是 BSON。当然了,BSON 本身高度兼容 JSON。
它上层看起来是文档型的,但底层还是 K/V 结构存储,索引其实还是去找 Key。而传统的关系型数据库基本都是 B-Tree + 数据页。
想深入的话你可以自己搜索一下 WiredTiger(MongoDB 3.2 后的默认、且官方推荐的存储引擎)的原理解读,大把大把的。