什么是虚拟列?

在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默认的方式

应用

这里配合5.7开始支持的json,来体验一下虚拟列的使用

1. 创建表

CREATE TABLE use_info (uid INT(11) NOT NULL AUTO_INCREMENT,uname VARCHAR(20) NOT NULL DEFAULT '',other_info json,PRIMARY KEY(uid)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

2. 写入数据

## 两种写入json数据方式INSERT INTO user_info (uname,other_info) VALUES ('first user',JSON_OBJECT("age",22,"real_name","Wayne","sex","男"));
INSERT INTO user_info (uname,other_info) VALUES ('second user','{"age":21, "real_name":"Jone", "sex":"女", "height":170, "weight":48}');

数据如图:

4.增加虚拟列 v_age(养成加前缀的好习惯, 例如这里使用"v_"来标记该字段是一个虚拟字段,在团队开发时,共同遵守一个约定, 相互配合起来会非常顺利)

##默认是Virtual Column,虚拟列不持久化ALTER TABLE user_info ADD COLUMN v_age TINYINT(3) UNSIGNED GENERATED ALWAYS AS (other_info->'$.age');

更新以后的表结构如下:

5. 查看更新后的数据

可以看到v_age已自动提取了other_info中的age字段

更新一下记录,把id=1的age更新为24

UPDATE user_info SET other_info=json_set(info,'$.age','24') WHERE uid=1;

再来看下数据,对应的v_age也更新为24,是不是有点像视图的感觉,哈哈

这里注意一下,insert时不要给虚拟列设定值, 否则会报错(这里就体现出了加前缀的好处,不管是别人还是自己,看到v_前缀就会意识到这是一个虚拟列,就不至于写出类似的错误语句了)

6. 关于索引,json字段无法对其中一个值使用索引,而虚拟列是支持索引的, 可以利用这一特性来索引json字段的某个值

#创建索引
ALTER TABLE user_info ADD INDEX v_age(v_age);

使用explain来查看一下v_age索引的使用情况,可以看到使用的索引的为v_age

好了,体验到此结束,如有错误欢迎指正

原创文章,转载请注明出处

转载于:https://www.cnblogs.com/nkefww/p/9964874.html

mysql5.7+ 虚拟列,json使用初体验相关推荐

  1. mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis

    背景:现有业务扩展字段,都存在feature字段,存在语义不清晰以及,难以利用索引查询问题 Mysql 5.7后推出利器,JSON+虚拟列,即实现了业务语义统一,也支持索引查询加速 一.简单描述 My ...

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

    MySQL自古以来就不提供函数索引这么复杂的功能.那怎么在MySQL里面实现这样的功能呢? 我们先来看看函数索引的概念.函数索引,也可称为表达式索引,也就是基于字段以特定函数(表达式)建立索引来提升查 ...

  3. MySQL5.7的date类型_Mysql5.7 虚拟列数据类型为DATE时,如何存入数据?

    表结构:v_date为虚拟列CREATE TABLE `test` (    `json` TEXT NULL,    `date` DATETIME NULL DEFAULT NULL,    `v ...

  4. mysql修改虚拟列属性失败_mysql虚拟列(Generated Columns)及JSON字段类型的使用

    mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型 一.先创建一个测试表: drop table if exists t_people; CREA ...

  5. HashMap 散列初体验

    参考目录: 1. HashMap 散列初体验 2. 为什么HashMap 常用String 对象作key 3. HashMap 原理 4.自定义 hashCode() 5.HashMap 的性能因子 ...

  6. mysql虚拟列(Generated Columns)及JSON字段类型的使用

    mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型 一.先创建一个测试表: 1 2 3 4 5 6 7 8 9 drop table  if ex ...

  7. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  8. Mysql数据库(一)——mysql数据库初体验

    Mysql数据库(一)--mysql数据库初体验 一.数据库的概念 1.数据库的组成 ①.表 ②.数据库 2.数据库类型 ①.关系型数据库 ②.非关系型数据库(NoSQL (Not Only SQL) ...

  9. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

最新文章

  1. 2022-2028年中国刨花板市场投资分析及前景预测报告(全卷)
  2. php怎么写获取手机剪切板到搜索栏,如何根据指定的剪切板获取html?
  3. mysql 去重_mysql 去重留一
  4. maven 插件未找到_防止在多模块Maven中找到“未找到插件”
  5. 微信小程序源码下载链接
  6. pytorch学习笔记(三十七):Adam
  7. python函数不包括参数函数_python中实现函数不限制参数的数量
  8. Java中线程出现Exception in thread Thread-0 java.lang.IllegalMonitorStateException异常 解决方法...
  9. TOGAF9.2企业架构师考试小记
  10. 数字 IC 笔试面试必考点(1)FPGA 芯片架构
  11. Java应用无响应、内存飙升、CPU飙升排查
  12. 计算机十年歌曲,抖音还有多少个十年能勇敢做热血青年是什么歌
  13. 视频工厂分享vlog拍摄技巧
  14. android录音mediaRecord\AudioRecord\openSL\PCM tinyalsa总结和优缺点
  15. 36岁,被单位解聘,我干起了深夜外卖
  16. 字体修改的一些心得以及方法分享
  17. 彻底解决文件路径问题
  18. 国外名校在线学位申请
  19. 很多人已经学会了应对恐惧和焦虑的秘诀
  20. nuiapp请求网络_‎App Store 上的“LEG-NUI”

热门文章

  1. 大白话5分钟带你走进人工智能-第十节梯度下降之归一化的各种方式和必要性(5)...
  2. 【bzoj4939】【YNOI2016】掉进兔子洞(莫队)
  3. 机器学习中的目标函数、损失函数、代价函数有什么区别?
  4. 背水一战 Windows 10 (61) - 控件(媒体类): InkCanvas 涂鸦编辑
  5. spring装配Bean过程
  6. 关于生成随机数的疑点
  7. 用c#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)
  8. JVM与Dalvik
  9. daily scrum 11.1
  10. POJ 1364 King (差分约束系统)