百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

MySQL Json有哪些缺点 mysql json类型对应java什么类型

liuian 2024-12-26 15:05 53 浏览

讨伐 json

今天的分享是再批 json, 去年分享过因为 mysql json 导致的故障,今天的 case 其实是去年的姊妹篇,原理一模一样。有两个原因不建议用 json:

  • Table Schema 就是强一致的,约束开发不要乱搞,json 这种弱约束的就是开后门,时间一长 json 字段就成了下水道
  • MySQL JSON 很垃圾,5.7 系列都有性能问题,测试 8.0 好很多。强烈建义大家,使用前压测一下
  • 上面提到的两点有争议?有争议就对了,一致认同是垃圾的东西谁会讨论它呢?

    实现

    JSON 有两种表示方法:文本可读的在 mysql 中对应 json_dom.cc, binary 二进制表示的对应 json_binary.cc

    If the value is a JSON object, its binary representation will have a 
    header that contains: 
     
    - the member count 
    - the size of the binary value in bytes 
    - a list of pointers to each key 
    - a list of pointers to each value 
     
    The actual keys and values will come after the header, in the same 
    order as in the header. 
     
    Similarly, if the value is a JSON array, the binary representation 
    will have a header with 
     
    - the element count 
    - the size of the binary value in bytes 
    - a list of pointers to each value 

    源码中注释也写的比较清楚,二进制分成两部分 header + element. 实际上 mysql 只是 server 识别了 json, 各个存储引擎仍存储的二进制 blob

    换句话说,底层引擎对 json 是无感知的,就是一条数据而己

    json-function-reference[1] 官方有好多在 server 层操作 json 的方法,感兴趣的可以看一下

    我们的问题

    MySQL Client 读取 json 时是 json_dom 调用 wrapper_to_string 方法,序列化成可读格式数据

    写入 json 时,是由 json_binary 调用 serialize_json_value 方法,序列化成上面图表示的 binary 数据,然后由引擎层存储成 blob 格式

    去年故障也有服务端的问题:加载单条数据失败主动 panic, 坑人不浅 (理由是数据不一致,宁可不对外提供服务,问题是那条数据恰好是重不重要的一类)。所以这个故事告诉我们: 在线服务的可用性,远高于数据一致性

    慢的原因是 wrapper_to_string 遇到 json array 特别多的情况下反复 mem_realloc 创建内存空间,导致性能下降

    其实去年没有 fix 完整,最近发现写入也有类似问题,只不过是 serialize_json_value 写入存储引擎前反复 mem_realloc 造成超时。这时前端页面发现写入超时了,(人工)重试继续写入 json 数据

    恰好赶上联合索引中有 NULL 字段,由此引出了唯一索引不唯一的现象。那怎么解决呢?前端按钮 cooldown 治标不治本,sql 执行 12s 前端肯定又点击提交了,治本还得升级 mysql 8.0 并且移除 NULL 字段, 那会不会又引入其它问题呢?

    项目初期做了错误的决定,后人很容易买单。希望我们踩到的坑,能让你决定使用 json 前犹豫几秒钟 ^^

    8.0 fix

    在测试机上发现 8.0 是 ok 的,没有性能问题,查看提交的 commit, 2016 年就有人发现并 fix 了,不知道有没有 back port 到 mysql 5.7 那几个版本

    commit a2f9ea422e4bdfd65da6dd0c497dc233629ec52e 
    Author: Knut Anders Hatlen  
    Date:   Fri Apr 1 12:56:23 2016 +0200 
     
        Bug#23031146: INSERTING 64K SIZE RECORDS TAKE TOO MUCH TIME 
     
        If a JSON value consists of a large sub-document which is wrapped in 
        many levels of JSON arrays or objects, serialization of the JSON value 
        may take a very long time to complete. 
     
        This is caused by how the serialization switches between the small 
        storage format (used by documents that need less than 64KB) and the 
        large storage format. When it detects that the large storage format 
        has to be used, it redoes the serialization of the current 
        sub-document using the large format. But this re-serialization has to 
        be redone again when the parent of the sub-document is switched from 
        small format to large format. For deeply nested documents, the inner 
        parts end up getting re-serializing again and again. 
     
        This patch changes how the switch between the formats is done. Instead 
        of starting with re-serializing the inner parts, it now starts with 
        the outer parts. If a sub-document exceeds the maximum size for the 
        small format, we know that the parent document will exceed it and need 
        to be re-serialized too. Re-serializing an inner document is therefore 
        a waste of time if we haven't already expanded its parent. By starting 
        with expanding the outer parts of the JSON document, we avoid the 
        wasted work and speed up the serialization. 

    参考资料

    [1]json-function-reference: https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

    MySQL Json有哪些缺点 | 《Linux就该这么学》 (linuxprobe.com)

    相关推荐

    扫描仪怎么安装(信鸽扫描仪怎么安装)

    扫描仪的安装步骤可能会略有不同,具体取决于您所使用的扫描仪品牌和型号。一般而言,您可以按照以下基本步骤来安装扫描仪:确认您的计算机系统符合扫描仪的最低系统要求。在计算机上插入扫描仪的安装光盘,或从制造...

    u盘怎么启动重装系统(u盘启动重装系统哪个好)

    1.下载好系统之家U盘以后在电脑上插入U盘并打开软件,软件会自,动配置用户的电脑信息,点击制作U盘启动盘。2.接着就进入了选择系统的界面,在这里选择需要安装的系统版本,然后点击开始制作。3.弹出提示窗...

    photoshopcs6哪一年的(pscs6版本好用吗)

    pscs6的发行时间是2012年4月24日,该软件是是AdobePhotoshop的第13代,具有多种功能,包括内容识别修补、Mercury图形引擎/3D性能提升/3D控制功能/改良的设计工具/全新的...

    电脑如何设置自动关机win10(win10系统电脑怎么设置自动关机)

    windows10自动关机设置方法如下1、打开电脑管家主界面,点击右下角的“工具箱”;2、在工具箱的其他分类中选择打开“健康小助手”;3、健康小助手中有三项功能,护眼配色、定时休息和定时关机,点击定时...

    wan口未连接是欠费吗(wan口未连接是怎么回事)

    网费欠费了路由器WAN指示灯常亮不闪烁,一个灯亮。路由器正常工作的话,电源指示灯是常亮状态,SYS系统指示灯和WAN指示灯会闪亮,尤其是WAN指示灯的状态有些复杂:如果WAN指示灯不亮,说明网络连接有...

    如何用手机修复sd卡(如何用手机修复sd卡受损)

    第一步:将要修复的内存卡,用读卡器连接到电脑上,然后下载失易得数据恢复软件。    第二步:运行软件,选择要恢复的“u盘/储存卡”功能。注:在恢复数据之...

    惠普台式机bios设置(惠普台式机bios设置核显内存)

    1、按电源键启动电脑,在屏幕刚亮时,不停点击F10按键,就可以进入BIOS界面;2、如果F10没反应,则在启动时不停点击ESC键;3、这个时候会进入到启动菜单选项,F10BIOSSetup就是BI...

    搜狗输入法不见了怎么调出来

    因为在设置里勾选了智能ABC风格,所以他会像智能ABC一样,按空格才会显示。右键点击搜狗皮肤,设置属性,勾选搜狗风格就好了。注意,当你勾选智能ABC风格的时候会自动勾选“按空格出字”。使用【ctrl...

    类似系统的黑科技网吧(系统的黑科技网吧好看吗)

    如果机器配置和装修都不追求高档的话应该差不多只要不是全部追求顶配基本上可以

    输入法哪个好用占内存又小(哪种输入法占内存小)

    最不占内存的是系统自带的输入法,不过只适合win8用户,对于win7和xp用户推荐qq输入法,不推荐搜狗(1,安装包就可以看出占用系统大小,2,各种后台运行,3,各种广告提醒),除了qq推荐谷歌输入法...

    2025组装机推荐配置(21年装机配置)

    1.CPU:Intel酷睿i5-10400F;2.主板:华硕H410M-K;3.内存:金士顿16GBDDR42666MHz;4.硬盘:希捷Barracuda1TB7200转;5.显卡...

    怎么恢复已经删除的人(怎么恢复已经删了的好友)
    怎么恢复已经删除的人(怎么恢复已经删了的好友)

    我们总是把美好的人和事进行拍照留念,手机相册中的照片越来越多,占用的空间也随之越来越大,如果在定期清理照片时误删了重要的照片,又该通过什么办法找回来呢?一、从手机最近删除中恢复手机照片删除之后,有两种方法可以找回,第一种就是手机自带的恢复功...

    2026-01-01 21:55 liuian

    三星手机系统下载(三星手机新版本下载)

    三星手机下载系统有几种方法,其中最常见的方法是通过手机的设置菜单来下载系统更新。用户可以进入手机的设置菜单,找到“关于手机”或“软件更新”选项,然后点击“检查更新”来查看是否有可用的系统更新。如果有更...

    安装系统要在u盘下载什么(安装系统对u盘要求)

    、U盘装系统分两种,一种是pe启动盘,一种是使用制作工具直接将系统刻录到U盘2、系统镜像也分很多种,ghost系统镜像有iso和gho两种,原版系统镜像有iso和wim两种3、如果是大白菜pe启动...

    原版win7家庭版(win7家庭版怎么样)

    同配置下的流畅度Win7家庭普通版》家庭高级版》专业版》旗舰版各版本的的功能存在差异,功能越少运行越流畅,因为后台进程较少。办公的话建议专业版起步,游戏的话就无所谓了。网上有一些精简版,跑起来贼流畅...