mysql json字段的使用与意义

时间:2023-01-02 02:37:47

mysql 5.7.8开始支持json字段类型,并提供了不少内置函数,通过计算列,甚至还可以直接索引json中的数据!

如果还不了解基础的可参看 mysql json快速入门


为何说json原生支持非常关键呢,不是可以自己在客户端处理json然后保存字符串到mysql不就完了?


来看一看,原生支持到底有什么意义


create table t (
 id int not null,
 js json not null,
 PRIMARY KEY (id)
)


1.可以直接过滤记录

select * from t where js->'$.a'=100

避免了要将所有记录都读取出来,在客户端进行过滤。


2.可以直接update,而无须先读取

update t set js=json_set(js,'$.a',js->'$.a'+1) where id=1

单条原子更新


update t,t1 set t.js=json_merage(t.js,t1.js) where t.id=t1.id

跨表更新


3.可以在一条SQL中完成多条纪录的修改!

update t set js=json_set(js,'$.a',123) where id in(1,2)

没有原生的支持,这个是很难实现的。


4.通过json类型,完美的实现了表结构的动态变化
除了一般意义上的增加表字段,还包括嵌套其他对象与数组

update t set js=json_array_append(js,'$.sonAry',123) where id =1

增加一个子节点到sonAry中,无须子表。


5.通过计算生成列在json上建立索引

CREATE TABLE j1 (
  id int(11) NOT NULL,
  js json NOT NULL,
  s varchar(45) CHARACTER SET utf8mb4 NOT NULL,
  a int(11) GENERATED ALWAYS AS (json_extract(js,'$.a')) STORED,
  PRIMARY KEY (id),
  KEY i_a (a)
)

通过a这个生成列(json_extract(js,'$.a'))上建立索引,
可以利用mysql的索引来快速定位。

json_extract还可利用path的通配符,发掘更多类型索引。

甚至还可利用JSON_CONTAINS/JSON_CONTAINS_PATH来建立索引。
这里可以组合出很多


与mongodb的差异

1.mongodb会自动建立表

也就是可以动态增加表,这点mysql还是必须先定义表


2.大部分查询插入更新操作,因为mysql json支持,两者没有什么功能差别了

但是就查询来说,mysql的SQL语法,特别是json_extract的简写模式,可读性比mongodb的要强不少


3.mongodb实际用牺牲事务性降低系统复杂度来实现高性能

这方面,要看用户使用场景,很难说优势还是劣势


4.对于大数据的支持

mongodb在大数据支持上做的比较好,特别是数据分片,高可用上基本内置实现了

mysql这方面也在不断完善

其差异主要还是在一致性上的选取,弱一致性导致容易分布处理,而强一致性则复杂很多.


我们可以假设,关系数据库设计之初如果放弃强一致性,那么这方面,mongodb等nosql实际也不会有任何优势.


从未来趋势来看,

强一致性方面,传统关系数据库始终是唯一最佳选择,而且通过支持json,把以前Nosql的一些优势也可以纳入到自己体系中.

对于固定的字段,显然传统的表处理方式性能更优,而对于动态字段放置独立的json字段中,也可以很好的适应这类需求.


弱一致性方面,NoSQL更擅长一些,传统关系数据库则可以在应用层面通过多实例数据库的分布方式来实现(来降低一致性提高数据吞吐量).


而在大分布式方面最终一致性方面,传统关系数据库缺乏直接支持,但还是可以通过应用层来实现,

而很多NoSQL也在不断完善这方面的功能.



我们期待一个基础关系数据库,每个实例提供强一致性的事务,易用的SQL,并对动态数据作出很好的支持.

并在实例之上有一个分布式的层,可以聚合大量数据库实例,并协助用户实现最终一致性,

这样就比较完美了.