MySQL 5.7 虚拟列 (virtual columns)(转)

原文地址:http://www.javashuo.com/article/p-hfjkpuea-gw.htmlhtml

参考资料:mysql

Generated Columns in MySQL 5.7.5linux

MySQL 5.7新特性之Generated Column(函数索引)sql

MySQL 5.7原生JSON格式支持express

Generated Columnjson

在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上创建索引更加合适sqlserver

综上,通常状况下,都使用Virtual Generated Column,这也是MySQL默认的方式ui

 

语法:spa

<type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ]
[ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]

 

应用:

为了实现对json数据中部分数据的索引查询,能够使用MySQL5.7中的虚拟列(virtual column)功能

建立表

create table user(uid int auto_increment,data json,primary key(uid));

构建数据

insert into user values (NULL,'{"name":"wang","address":"shenyang"}');
insert into user values (NULL,'{"name":"zhao","address":"riben"}');

构建姓名的虚拟列

alter table user add user_name varchar(20) generated always as (data->'$.name');

构建索引

alter table user add index idx_name(user_name);

查询

select * from user where user_name='"wang"';

查询分析(explain  ……  \G)

能够看出用了索引了

此时的表的结构因为多出了user_name这一虚拟列,再插入别的数据要注意在表后指明插入列(不能给虚拟列插入数据)

insert into user(uid,data) values (NULL,'{"name":"pan","address":"sichuan"}');
相关文章
相关标签/搜索