參考資料:html
Generated Columns in MySQL 5.7.5mysql
MySQL 5.7新特性之Generated Column(函數索引)linux
Generated Columnexpress
在MySQL 5.7中,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁盤上;後者會將Generated Column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了能夠經過已有數據計算而得的數據,須要更多的磁盤空間,與Virtual Column相比並無優點,所以,MySQL 5.7中,不指定Generated Column的類型,默認是Virtual Column。json
若是須要Stored Generated Golumn的話,可能在Virtual Generated Column上創建索引更加合適函數
綜上,通常狀況下,都使用Virtual Generated Column,這也是MySQL默認的方式sqlserver
語法:ui
<type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ]
[ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]spa
應用:
爲了實現對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"}');