MySQL的 JSON 字段的工作原理是什么

json 字段是怎么工作的?整个序列化成字符串后存储,然后查询的时候,从 json 字段从硬盘加载到内存,在数据库 Server 的 内存中,在整个反序列化吗?

如果这样的话性能会很差,因为序列化和反序列化是需要时间的,占时间有占 CPU 资源

json 字段是怎么融合到 B+ 树中去的?

合理的方式因为是做按照 KEY:VALUE 的结构做特殊存储处理吧!

还有就是 MongoDB 是怎么处理这个问题的?

关于何时使用 json 字段,看到一个群友说的有一点点道理:

我在mysql里用json就是解决表新增列的问题。数据过多新增列,mysql会锁表停服,即便有tptools这种工具,运维也不愿意配合搞。所以如果新增的列不涉及索引,只是通过主键查到数据后输出这个属性,json是个好的选择

阅读 4.7k
2 个回答

首先 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 后的默认、且官方推荐的存储引擎)的原理解读,大把大把的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题