zoukankan      html  css  js  c++  java
  • 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"}');
  • 相关阅读:
    逻辑卷管理LVM (Logical Volume Manager)
    Windows Server 2008 R2 域控修改域用户密码复杂性
    win7 加域开机自动登录域用户
    红帽Linux 配置VNC桌面远程工具
    Redhat linux 挂载命令mount
    SUSE Linux 防火墙设置
    IPv4 地址分类
    常用RAID简介_001
    Element UI
    ie中datepicker赋值不成功
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/11655341.html
Copyright © 2011-2022 走看看