JSON & 虚拟列
什么是虚拟列?
在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默认的方式
特殊用途冗余列
列长度还是和定义类型一样
能正常加索引
查询效率上,物理>STORED>VIRTUAL
应用
这里配合5.7开始支持的json,来体验一下虚拟列的使用
1. 创建表
CREATE TABLE user_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}');
数据如图:
mysql> select * from user_info where other_info->'$.age'='24';
+-----+------------+---------------------------------------------------+-------+
| uid | uname | other_info | v_age |
+-----+------------+---------------------------------------------------+-------+
| 1 | first user | {"age": "24", "sex": "男", "real_name": "Wayne"} | 24 |
+-----+------------+---------------------------------------------------+-------+
1 row in set (0.00 sec)
mysql> select * from user_info where json_extract(other_info,'$.age')='24';
+-----+------------+---------------------------------------------------+-------+
| uid | uname | other_info | v_age |
+-----+------------+---------------------------------------------------+-------+
| 1 | first user | {"age": "24", "sex": "男", "real_name": "Wayne"} | 24 |
+-----+------------+---------------------------------------------------+-------+
1 row in set (0.00 sec)
3.增加虚拟列 v_age(养成加前缀的好习惯, 例如这里使用"v_"来标记该字段是一个虚拟字段,在团队开发时,共同遵守一个约定, 相互配合起来会非常顺利)
##默认是Virtual Column,虚拟列不持久化
ALTER TABLE user_info ADD COLUMN v_age TINYINT(3) UNSIGNED GENERATED ALWAYS AS (other_info->'$.age');
更新以后的表结构如下:
4. 查看更新后的数据
可以看到v_age已自动提取了other_info中的age字段
更新一下记录,把id=1的age更新为24
UPDATE user_info SET other_info=json_set(other_info,'$.age','24') WHERE uid=1;
再来看下数据,对应的v_age也更新为24,是不是有点像视图的感觉,哈哈
这里注意一下,insert时不要给虚拟列设定值, 否则会报错(这里就体现出了加前缀的好处,不管是别人还是自己,看到v_前缀就会意识到这是一个虚拟列,就不至于写出类似的错误语句了)
5. 关于索引,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
JSON & 虚拟列的更多相关文章
- MySQL 5.7 虚拟列 (virtual columns)
参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7新特性之Generated Column(函数索引) MySQL 5.7原生JSON格式支持 Gener ...
- MySQL 5.7 虚拟列 (virtual columns)(转)
原文地址:https://www.cnblogs.com/raichen/p/5227449.html 参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7 ...
- [oracle 11g 新特性] virtual column虚拟列
总结:虚拟列可以使用于一些特殊场合,实质是类似于函数列(即以 表中已有的列 经过函数运算得来),“虚拟列不存储在数据库中,是在执行查询时由oracle后台计算出来返回给用户”,因此虚拟列不会增加存储空 ...
- Oracle 11g 虚拟列 Virtual Column介绍
Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: ...
- Oracle 11g 新特性(一)-- 虚拟列
数据库版本: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Oracle11g 增加了虚拟列的新特性, 具体说明如 ...
- SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来 select * from tbl_diary_reback a left join tbl_diary_reback ...
- Oracle 11g新特性虚拟列分区
如今有个需求:一个单据表要依照月份来分区.假设是在Oracle 10g上,仅仅能再加一个字段. 在Oracle 11g以后就不一样了.能够用虚拟列处理. SQL> select * from v ...
- 使用mysql5.7新特性(虚拟列)解决使用前通配符性能问题
众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...
- MariaDB扩展特性--虚拟列
存在于表中的列,它们的值是根据确定的表达式或者是根据表中其他列的值自动计算的. 虚拟列有两种,分别对应了定义虚拟列的修饰关键词: 'VIRTUAL'修饰词含义为该虚拟列的值会在查询的时候计算生成. ' ...
随机推荐
- 小福bbs-冲刺集合
[小福bbs-冲刺集合] 一 . 7次团队冲刺博客的链接 第①次冲刺链接 第②次冲刺链接 第③次冲刺链接 第④次冲刺链接 第⑤次冲刺链接 第⑥次冲刺链接 第⑦次冲刺链接 冲刺的时间 日志博客的名称 当 ...
- https://github.com/python/cpython/blob/master/Doc/library/contextlib.rst 被同一个线程多次获取的同步基元组件
# -*- coding: utf-8 -*- import time from threading import Lock, RLock from datetime import datetime ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- Activity: launchMode 和 Intent.FLAG_ACTIVITY_CLEAR_TOP
Activity 的 launchMode: 1. standard: 标准模式 这种启动模式为标准模式,也是默认模式.每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已 ...
- Android开发Camera2相关
Android自定义相机 https://github.com/miqt/camera2 Camera2必知必会 https://www.cnblogs.com/fuyaozhishang/p/975 ...
- Apache 使用ssl模块配置HTTPS(Centos7 httpd2.4.6)
根据原文:http://blog.csdn.net/ithomer/article/details/50433363改编 Web服务器在默认情况下使用HTTP,这是一个纯文本的协议.正如其名称所暗示的 ...
- 一些有用的github收藏(持续更新中...)
1.facebook的c++开源库folly(Facebook open source library)介绍 https://github.com/facebook/folly 2.pprint 一个 ...
- ES6深入浅出-7 新版的类(上集)-2.介绍JS中的类
声明对象原型,公有属性. obj对象,它用一个属性__proto__记录了自己的原型 改掉它的原型为公有属性.那么obj这个对象及有了hi的方法.因为obj自己没有hi.那么就去自己的原型上去找了. ...
- 研究 node lzma 的压缩解压缩
/ eslint-disable / // 压缩为 lzma var fs = require('fs'); var lzma = require('lzma-native'); var compre ...
- Hashset(不能添加相同的字符进入数组)
参考: https://ke.qq.com/webcourse/index.html#cid=434021&term_id=100518216&taid=377652179413386 ...