对mysql中json字段类型的几个疑问


对mysql中json字段类型的几个疑问

  • 测试环境: win10 Mysql5.7.31
  1. json字段如果置空,是否占用空间?占用多少空间?
  2. json字段对比一定长度的varchar哪个占用的空间大?
    针对该问题,我进行了测试,创建了两张表,主键均为自增。
CREATE TABLE tb_1(
id int PRIMARY KEY auto_increment ,
info json
)
CREATE TABLE tb_2(
id int PRIMARY KEY auto_increment ,
info VARCHAR(512)
)

各有一个info字段,tb_1使用json类型,tb_2使用varchar类型,长度(512)。并为两张表各插入了10000行数据。json的内容均为{"test":"1"}.

所占空间如下
image

这可以看得出,json字段实际占用的空间远大于varchar(512),那如果将varchar的长度为1024呢?我又新建了一张tb_3,varchar的长度为1024.

CREATE TABLE tb_3(
id int PRIMARY KEY auto_increment ,
info VARCHAR(1024)
)

image
从上图可得知,tb_2与tb_3的.ibd文件大小是一样的,同为491,520字节,难道mysql的varchar字段大小不一致时,所占用的空间也相同吗?

对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。
————————————————
版权声明:本文为CSDN博主「阿萨德执行」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010365717/article/details/98496767

如果采用varchar字段进行存储json还有一个坏处,你永远无法确定你的json大小有多大,那么你就很难精准的去声明这个长度,申请得多了或少了都不合适。那么使用json这类专项的字段也才是最合适的。但,mysql中还有一种字段,叫text,使用text字段来存储json对于硬盘的占用是否与json字段一致呢?我再创建一张表tb_4来进行测试。

CREATE TABLE tb_4(
id int PRIMARY KEY auto_increment ,
info text
)

image
这从图片中可以看得出,text字段与varcahr字段所占用的硬盘空间是一致的。
那么json字段与text字段对于内存的占用呢?以及json字段的长度上限是多少呢?

  • 关于表结构文件frm
    前面在进行对比tb_2与tb_3时,我发现.ibd文件的大小是相同的,但frm文件却差了非常多,这还只是一个字段长度的差异,那么如果是多个字段长度差异较大呢?
    那么我将再创建几张表进行对比,创建一张tb_4,有五个字段,均为varcahr,长度均为200。以及表tb_5,也是五个varchar字段,但是长度为300,再来查看


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM