mysql中生成列与JSON类型的索引
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql中生成列与JSON类型的索引,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2784字,纯文字阅读大概需要4分钟。
内容图文
MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的。
一个简单的例子来认识生成列!
CREATE TABLE triangle( sidea DOUBLE , sideb DOUBLE , sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERTINTO triangle(sidea, sideb) VALUES(3,4),(6,8),(5,12); mysql>select*from triangle; #插入数值的时候并没有插入c的值,但是查询的时候,还是有了c值 +-------+-------+-------+| sidea | sideb | sidec |+-------+-------+-------+|3|4|5||6|8|10||5|12|13|+-------+-------+-------+3 rows inset (0.00 sec) mysql>
生成列中的值,是根据生成列的定义计算出来的!
生成列的定义如下:
col_name data_type [GENERATED ALWAYS]AS (expression) [VIRTUAL | STORED][NOT NULL | NULL][UNIQUE [KEY]] [[PRIMARY]KEY] [COMMENT ‘string‘]
#AS表达式表示生成列并用于计算生成列的表达式。As之前的GENERATED ALWAYS可以让生成列的性质更明确(应该没什么作用,反正是可以省略的)!
#VIRTUAL | STORED 关键字表示列值的存储方式
-
VIRTUAL: 不存储列值,但在读取值之前立即计算此列的数值,虚拟列不占存储空间,innodb支持虚拟列上的二级索引。为默认的存储方式。
- STORED:插入或更新时,将计算存储列的值,并且占用存储空间。
生成列的表达式必须遵循以下的规则,否则会报错:
- 允许使用字符串,运算符和确定性内置函数。对于给定的相同的数据库,不同连接的用户调用会产生相同的结果,则这个函数时确定的。now()函数就不是确定性函数。
- 不允许使用子查询,参数,变量,存储函数(stored functions)和用户自定义的函数。
- 生成的列定义可以引用其他生成的列,但只能引用表定义中较早出现的列。 生成的列定义可以引用表中的任何基本(非生成)列,无论其定义是早期还是稍后发生。
- auto_increment属性不能再生成列的定义中使用。
-
一个
AUTO_INCREMENT
列不能用作在生成的列定义的基柱 (AnAUTO_INCREMENT
column cannot be used as a base column in a generated column definition.) - 从MySQL 5.7.10开始,如果表达式求值导致截断或向函数提供不正确的输入,则 CREATE TABLE 语句将以错误终止并拒绝DDL操作
生成列的作用(可能不太准确):
- 虚拟生成的列可用作简化和统一查询的方法。可以将复杂条件定义为生成列,并从表上的多个查询引用,以确保他们全部使用完全相同的条件。
- 存储生成的列可以用作物化缓存,用于复杂的条件,这些条件在运行中计算成本很高。
- 生成列可以模拟功能索引,利用生成列定义功能表达式对其进行索引。例如对JSON数据类型。对于存储的生成列,这种方法缺点是存储两次,一次是生成列的值,另一次是索引。
- 如果生成的列已编制索引,则优化程序将识别与列定义匹配的查询表达式,并在查询执行期间根据需要使用列中的索引,即使查询未按名称直接引用该列也是如此。
如下一个含有json类型字段的表:
CREATE TABLE json_test ( id INT auto_increment PRIMARYKEY, userinfo json ); #插入数据 INSERTINTO json_test(userinfo) VALUES(‘{"name":"libai","address":"china","email":"libai@163.com"}‘); INSERTINTO json_test(userinfo) VALUES(‘{"name":"obama","address":"miguo","email":"libai@gmail.com"}‘); INSERTINTO json_test(userinfo) VALUES(‘{"name":"putin","address":"russia","email":"putin@gmail.com"}‘); #
给表中添加生成列
alter table json_test addcolumnuser_namevarchar(40) generated always as (userinfo->"$.name") virtual; #查看表中的数据 mysql>select*from json_test; +----+--------------------------------------------------------------------+-----------+| id | userinfo |user_name|+----+--------------------------------------------------------------------+-----------+|1| {"name": "libai", "email": "libai@163.com", "address": "china"} | "libai" ||2| {"name": "obama", "email": "libai@gmail.com", "address": "miguo"} | "obama" ||3| {"name": "putin", "email": "putin@gmail.com", "address": "russia"} | "putin" |+----+--------------------------------------------------------------------+-----------+3 rows inset (0.00 sec) #在表中插入数据user_name列的数值会自动计算,这时候,我们就可以对user_name列添加索引!
原文:https://www.cnblogs.com/wxzhe/p/9763777.html
内容总结
以上是互联网集市为您收集整理的mysql中生成列与JSON类型的索引全部内容,希望文章能够帮你解决mysql中生成列与JSON类型的索引所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。