MySQL 5.7 虚拟列 (virtual columns)

参考资料:

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)

可以看出用了索引了

时间: 2024-10-21 22:13:20

MySQL 5.7 虚拟列 (virtual columns)的相关文章

Oracle 11g 虚拟列 Virtual Column介绍

Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL] 1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用于DML语句 2.可以基于虚拟列来做分区 3. 可以在虚拟列上建索引,o

Oracle 11g新特性之--虚拟列(Virtual Column)

Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL] 1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用

[oracle 11g 新特性] virtual column虚拟列

总结:虚拟列可以使用于一些特殊场合,实质是类似于函数列(即以 表中已有的列 经过函数运算得来),“虚拟列不存储在数据库中,是在执行查询时由oracle后台计算出来返回给用户”,因此虚拟列不会增加存储空间,但是由于需要计算,需要消耗额外的CPU Time. ---创建表时使用虚拟列 SQL> create table test4(id number,name varchar2(300),hash_id as(ora_hash(id))); Table created ---alter 表新增虚拟列

Oracle 虚拟列 子分区 virtual column partition

Oracle 11g 虚拟列子分区实验 以下两个create 语句均为创建成功: 需求描述: 项目要求对3个字段进行分区,如时间,小时,还有个区域ID,便联想到虚拟列. drop table test_part purge;   create table test_part  (t_time date,  hour number,  city_id number,  hour_city varchar2(108) GENERATED ALWAYS AS(to_char(hour)||'|'||t

mysql5.7虚拟列初次尝试

添加虚拟列 ALTER TABLE erp_new_source_reports add client_name VARCHAR(80) generated always as (clients->"$.name"); ALTER TABLE erp_new_source_reports add client_type VARCHAR(20) generated always as (clients->"$.type"); ALTER TABLE erp

【原创】MySQL5.7 虚拟列实现表达式索引

MySQL自古以来就不提供函数索引这么复杂的功能.那怎么在MySQL里面实现这样的功能呢? 我们先来看看函数索引的概念.函数索引,也可称为表达式索引,也就是基于字段以特定函数(表达式)建立索引来提升查询性能之需.函数索引的优势在于更加精确的获取所需要的数据. MySQL 5.7提供了一个新的特性,虚拟列,可以很完美的解决这个问题. 在介绍虚拟列之前,我们来看看在MySQL里面普通索引的范例. 示例表结构: CREATE TABLE t1 (id INT ,rank INT, log_time D

PXE安装Centos65 postfix+exmail+mysql实现基于 虚拟用户的web邮件系统

PXE安装Centos postfix+exmail+mysql实现基于 虚拟用户的web邮件系统 在实现centos+postfix的web内网邮件之前,参考了许多网上.书本知识,经过两次大的改动,目前该系统已经为公司正常服务工作五年多. 第一部分 win7+tftpd32+PXE安装CentOS6.5 32bit 第一步 安装CentOS6.5 32bit操作系统 基于win7+tftpd32+PXE来安装,但我这里只用虚拟机VMware Workstation9.0.1 build-894

MySQL5.7 虚拟列实现表达式索引

MySQL自古以来就不提供函数索引这么复杂的功能.那怎么在MySQL里面实现这样的功能呢? 我们先来看看函数索引的概念.函数索引,也可称为表达式索引,也就是基于字段以特定函数(表达式)建立索引来提升查询性能之需.函数索引的优势在于更加精确的获取所需要的数据. MySQL 5.7提供了一个新的特性,虚拟列,可以很完美的解决这个问题.在介绍虚拟列之前,我们来看看在MySQL里面普通索引的范例.示例表结构: CREATE TABLE t1 (id INT ,rank INT, log_time DAT

ORACLE虚拟索引(Virtual Index)

ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目的是模拟索引的存在而不用真实的创建一个完整索引.这允许开发者创建虚拟索引来查看相关执行计划而不用等到真实创建完索引才能查看索引对执行计划的影响,并且不会增加存储空间的使用.如果我们观察到优化器生成了一个昂贵的执行计划并且SQL调整指导建议我们对某些的某列创建索引,但在生产数据库环境中创建索引与测试并