MySQL 5.7 虛擬列 (virtual columns)(轉)


原文地址:https://www.cnblogs.com/raichen/p/5227449.html

參考資料:

Generated Columns in MySQL 5.7.5

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

MySQL 5.7原生JSON格式支持

Generated Column

在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上建立索引更加合適

綜上,一般情況下,都使用Virtual Generated Column,這也是MySQL默認的方式

 

語法:

<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"}');

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM