1.起源
近期在做一个需求,后台要按用户提交数据的顺序展示,此时数据库的字段存为json,在代码中明明已经按照特定顺序排序好了为什么还是展示顺序还是不对,最后发现数据库存储的格式为Json.存入数据库时的顺序和你代码里的顺序是不一致的,因为json本身就是无序的
接下来正好探究一下这个第一次使用的数据类型
2.JSON数据使用
JSON(JavaScript Object Notation)主要用于互联网应用服务之间的数据交换。
JSON 类型是 MySQL 5.7 版本新增的数据类型,但是使用 JSON 数据类型,推荐用 MySQL 8.0.17 以上的版本,性能更好,同时也支持 Multi-Valued Indexes;
MySQL 支持RFC 7159定义的 JSON 规范,主要有 JSON 对象 和 JSON 数组 两种类型。
JSON 对象
{
"a":a,
"b":{
"b1":1
},
"c":[1,2,3]
}
JSON 数组
[
{
"a":a,
"b":{
"b1":1
},
"c":[1,2,3]
},
{
"a":a,
"b":{
"b1":1
},
"c":[1,2,3]
}
]
上述JSON数组内有两个JSON对象
JSON 是一种新的类型,有自己的存储格式,还能在每个对应的字段上创建索引,做特定的优化,这是传统字段串无法实现的.
JSON 类型的另一个好处是无须预定义字段,字段可以无限扩展。而传统关系型数据库的列都需预先定义,想要扩展需要执行 ALTER TABLE … ADD COLUMN … 这样比较重的操作。
可以使用->运算符检索JSON列的字段
ELECT id, browser ->’$.name’ browser FROM events;
但是用此命令查询出的结果会有引号
如果不用引号检索数据,可以使用->> 运算符(推荐此方式)
3.索引相关
JSON列不能直接编入索引。可以在包含从JSON列中提取的值的生成列上创建索引。当从JSON列查询数据时,MySQL优化器将在匹配JSON表达式的虚拟列上查找兼容的索引。
要从JSON列中引出值,可以使用列路径运算符(->)
在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与Virtual Column相比并没有优势,因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column。
如果需要Stored Generated Golumn的话,可能在Virtual Generated Column上建立索引更加合适,一般情况下,都使用Virtual Generated Column,这也是MySQL默认的方式;
4.本次解决思路
方案1:
在传入参数时,若json内数据是有规律的,则传成JSONARRAY,数组形式的,将json内的每个kv变为数组的一部分
方案2:
传入时增加排序字段,在代码中转为list根据排序返回
方案3:
将排序配置到数据库中,也是将返回的数值进行比对排序