使用Mysql虚拟列(virtual columns)为Json数据类型创建索引

使用MySQL虚拟列(virtual columns)为Json数据类型创建索引

创建表
CREATE TABLE user_info ( 
	uid INT auto_increment, 
	DATA json, 
	PRIMARY KEY(uid)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
插入数据
insert into user_info values (NULL,'{"name":"zhangsan","address":"beijing"}');
insert into user_info values (NULL,'{"name":"wanger","address":"tianjing"}');
构建姓名的虚拟列
方法1:
alter table user_info add v_name varchar(20) generated always as (JSON_EXTRACT(data,'$.name'));
方法2:
alter table user_info add v_name varchar(20) generated always as (data->'$.name');
构建索引
alter table user_info add index idx_name(v_name);

使用如下查询语句

SELECT * FROM user_info WHERE v_name='zhangsan';

在这里插入图片描述
并不能查询到结果,需使用

SELECT * FROM user_info WHERE v_name='"zhangsan"';

方可查询到结果。
在这里插入图片描述

由此可以知道构建的虚拟列中的数据多了 "" ,那么如何去掉呢

alter table user_info modify column v_name varchar(20) generated always as (JSON_UNQUOTE(data->'$.name')) VIRTUAL;
构建地址虚拟列并创建索引
构建虚拟列:
alter table user_info add v_address varchar(20) generated always as (JSON_UNQUOTE(data->'$.address'));
创建索引:
alter table user_info add index idx_user_info(v_name,v_address);

如此查询语句可以正常使用索引,查询与普通表无异。

此时的表结构由于多了v_namev_address这两个虚拟列,再插入别的数据需要指明插入列 (不能给虚拟列插入数据)

insert into user_info(data) values ('{"name":"lisi","address":"sichuan"}');

需要注意,不能建立虚拟列与真实列的组合索引。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值