MySql中json类型的使用

MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段进行索引。


一、使用json的目的

1、可以直接过滤记录
2、可以直接update,而无须先读取
3、可以在一条SQL中完成多条纪录的修改!
4、通过json类型,完美的实现了表结构的动态变化
5、通过计算生成列且在该列上建立索引。提高查询效率

二、开始使用

1.建表

建表语句如下:

CREATE TABLE `msg_info` (
  `id` int(10) unsigned NOT NULL,
  `message` json NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.插入数据

insert into msg_info values (1,'{"name":"zhangsan","phone":"13752763211"}');
insert into msg_info values (2,'{"name":"lisi","phone":"13752763222"}');

3.查询更新操作

1、过滤记录

select * from	msg_info where message->'$.phone'='13752763211';

2、查询json内指定字段

select message->'$.name' from	msg_info;
# 这样查询出来的字段是带双引号的,使用如下语句可去除双引号,也可以使用关键字JSON_UNQUOTE
select message->>'$.name' from	msg_info;

3、直接更新json串内的字段内容

UPDATE msg_info set message = JSON_SET(message, '$.name', 'lili') WHERE id = 1;
# 为json串添加字段
update msg_info set message = JSON_INSERT(message, '$.age', 30) WHERE id = 1;

3.动态扩展字段

1、为json添加虚拟字段

ALTER TABLE msg_info  ADD v_phone  varchar (12) GENERATED ALWAYS  AS (JSON_UNQUOTE(message->'$.phone' ));

2、为虚拟字段创建索引,提高查询效率

# 通过执行计划可以查看创建索引前后的变化
ALTER TABLE msg_info ADD INDEX idx_phone(v_phone);