MySQL 5.7 虛擬列 (virtual columns)

參考資料:html

Generated Columns in MySQL 5.7.5mysql

MySQL 5.7新特性之Generated Column(函數索引)linux

MySQL 5.7原生JSON格式支持sql

 

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"}');
相關文章
相關標籤/搜索