首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • MySQL 虚拟详解

    在 MySQL 中,虚拟(也称为生成或计算)是从一个或多个其他派生的,但不实际存储在数据库表中。 使用 MySQL 虚拟就非常简单了,MySQL 会在查询时自动计算并返回结果。创建虚拟要创建一个虚拟,你可以在创建表时或者在现有表上使用 ALTER TABLE 语句。 注意,MySQL 5.7 及之前的版本不支持虚拟,但从 MySQL 8.0 开始支持生成(包括虚拟)。 在现有表上添加虚拟-- 假设原来的表达式是 (column1 + column2)-- 新的表达式是 (column1 * column2) -- 首先删除旧的虚拟(如果它实际上是一个真实的物理, 这意味着生成的值会被存储在磁盘上,类似于普通。但是,它们仍然只在查询时计算。VIRTUAL:虚拟生成的。这类不会在磁盘上存储其值,而是在查询时根据基础动态计算得出。

    31110编辑于 2025-11-22
  • 来自专栏数据和云

    实战演练:通过伪虚拟实现SQL优化

    一.通过伪虚拟实现SQL优化 慢 SQL 文本如下: ? SQL 执行时长达 38S,获取 361 条数据结果返回。 SQL 执行计划如下: ? 虚拟实现SQL优化 分析 SQL 可知,SQL 的性能瓶颈在于 a.minute = DATE_FORMAT(b.create_time, '%H:%i') 两表之间的关联关系,SQL 无法通过表之间的关联关系直接驱动 MySQL 5.7 增加了虚拟的新功能,可以类似的实现 Oracle 函数索引。由此思路,month_show_data 增加虚拟 vr_time,并添加虚拟索引 idx_vr_time。 伪的引入,可以强制 SQL 改变表之间的关联顺序,获得想要的执行计划。将 SQL 改写成如下方式: ? SQL 在 0.004s 之后即返回查询结果。 执行计划如下: ? MySQL 5.7 虚拟的引入可以在不改动业务实现的情况下,实现函数索引类似的需求。基于代价的优化器存在缺陷,并不能每次都会选出最优的执行计划。

    2.1K31发布于 2018-07-27
  • 来自专栏bisal的个人杂货铺

    函数索引构成虚拟隐藏

    从回复看,SYS_NC00004$就是原始列名,只是他是个虚拟隐藏的,并且数据默认值是“原始”,即函数表达式作用的, The "construction rule" is the original qualified_col_name from user_tab_cols where table_name='PRODUCT'; P.S. user_tab_cols和user_tab_columns相比,有些未做过滤 $的字段,数据类型是RAW的,只有他含默认值,带引号的"SUPPLIER_ID",应该就是对SUPPLIER_ID加了函数,HIDDEN_COLUMN和VIRTUAL_COLUMN都是YES,他是一个虚拟隐藏

    1.3K20发布于 2019-08-18
  • 来自专栏菜鸟成长学习笔记

    探索MySQL 5.7 虚拟 (virtual columns)

    Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一数据持久化到磁盘上 UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ] 应用: 为了实现对json数据中部分数据的索引查询,可以使用MySQL5.7中的虚拟 构建姓名的虚拟 alter table user add user_name varchar(20) generated always as (data->'$.name'); ? 可以看出用了索引了 此时的表的结构由于多出了user_name这一虚拟,再插入别的数据要注意在表后指明插入列(不能给虚拟插入数据) insert into user(uid,data) values

    2.4K20发布于 2020-05-19
  • 来自专栏性能与架构

    Mysql 5.7 的‘虚拟’是做什么?

    Mysql 5.7 中推出了一个非常实用的功能 虚拟 Generated (Virtual) Columns 对于它的用途,我们通过一个场景来说明 假设有一个表,其中包含一个 date 类型的 ` 虚拟 Generated Columns 就是用来解决这个问题的,可以增加一个可被索引的,但实际上并不存在于数据表中 对于上面的例子,可以对 SimpleDate 创建一个虚拟,然后对虚拟创建索引 , PRIMARY KEY (`id`), KEY `SimpleDate_dayofweek` (`SimpleDate_dayofweek`), ) ENGINE=InnoDB 这样就建好了虚拟 查询语句可以正常使用索引 通过虚拟的方式,即满足了查询性能,也不会有之前那个解决方案的潜在麻烦 虚拟不存储在数据行中,但虚拟的元数据信息会存在于相关系统表中,对虚拟的添加或者删除只会涉及这些系统表 ,不会导致数据表的重建,所以效率很高 需要注意,不能建立虚拟和真实的联合索引

    2.2K60发布于 2018-04-03
  • 来自专栏MySQLBeginner

    使用 MySQL 5.7 虚拟提高查询效率

    在这篇博客中,我们将看看如何使用MySQL 5.7的虚拟来提高查询性能。 说明 大约两年前,我发表了一个在MySQL5.7版本上关于虚拟的文章。从那时开始,它成为MySQL5.7发行版当中,我最喜欢的一个功能点。 原因很简单:在虚拟的帮助下,我们可以创建间接索引(fine-grained indexes),可以显著提高查询性能。 解决方案 好消息是,在MySQL 5.7中我们有虚拟。所以我们可以在“CONCAT(verb, ‘ – ‘, replace(url,’.xml’,”))”之上创建一个虚拟。 ; 对上面的虚拟创建索引。

    4.7K11发布于 2019-02-27
  • 来自专栏MySQLBeginner

    使用MySQL 5.7虚拟提高查询效率

    说明 大约两年前,我发表了一个在MySQL5.7版本上关于虚拟的文章。从那时开始,它成为MySQL5.7发行版当中,我最喜欢的一个功能点。 原因很简单:在虚拟的帮助下,我们可以创建间接索引(fine-grained indexes),可以显著提高查询性能。 解决方案 好消息是,在MySQL 5.7中我们有虚拟。所以我们可以在“CONCAT(verb, ‘ – ‘, replace(url,’.xml’,”))”之上创建一个虚拟。 - ', replace(url,'.xml',''))))) VIRTUAL; alter table ApiLog add key (verb_url_hash); 所以我们在这里做的是: 声明虚拟 ; 对上面的虚拟创建索引。

    2.5K20发布于 2019-04-24
  • 来自专栏全栈程序员必看

    Oracle 11g新特性虚拟分区

    能够用虚拟处理。

    1.2K20编辑于 2022-08-27
  • 来自专栏全栈程序员必看

    不允许对虚拟执行 UPDATE 操作

    结果查询到的还有表自己生成的隐藏  虚拟,结果进行新增操作时候出现了以上问题, 后面改为  SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME

    1.3K30发布于 2021-04-07
  • 来自专栏数据核心

    深入探索MySQL的虚拟:发展、原理与应用

    为了解决这个问题,MySQL 5.7版本引入了虚拟(也称为生成)的概念。虚拟允许开发者在表中定义一个基于其他的计算公式,而不需要实际存储这些计算的结果。 当查询虚拟时,MySQL会根据公式动态计算其值。 在后续的版本中,MySQL进一步增强了虚拟的功能,允许开发者选择是否将虚拟的结果实际存储在磁盘上(即存储),以提高查询性能。 二、虚拟的原理 虚拟的工作原理相对简单。当你在表中定义一个虚拟时,你需要为其提供一个表达式,该表达式基于表中的其他。每当查询虚拟时,MySQL都会根据该表达式动态计算其值。 三、虚拟的用法 当你定义一个虚拟时,你需要使用GENERATED ALWAYS AS语句来指定该的值是如何从其他列计算得出的。 我们创建一个表,其中包含一个JSON和一个基于JSON中某个值的虚拟。然后,我们为这个虚拟创建索引以提高查询性能。

    1.8K10编辑于 2024-03-21
  • 来自专栏智慧零售领域相关技术应用

    MySQL虚拟在电商场景下的应用

    引言 有时候大家在做电商商品推广的时候会涉及到一些json串的存储,同时在检索的时候会通过json中里面的段就进行相关检索,这样的话就可能会引入虚拟这个概念。 下面用一个简单的例子来介绍一下虚拟的使用。 JSON 文档被转换为允许对文档元素进行快速读取访问的内部格式 虚拟的实践 数据准备 确认MySQL版本 查看mysql 版本必须在5.7.8及以上,查看命令参考: show variables like data_json.commission_amount 查询commission_amount大于30的总数,发现效果并不理想,耗时1.48s,效果图如下: image.png 那么我们是不是可以考虑把commission_amount作为一个虚拟加上索引这样会不会效果好一点呢 虚拟字段 添加虚拟字段v_commission_amount,添加脚本参考如下: alter table t_data_json add v_commission_amount double(10,2)

    2.7K94编辑于 2021-12-24
  • 来自专栏朝雨忆轻尘

    Java虚拟机(七):JVM调优案

    当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。 参数详解  -server 启用jdk 的 server 版; -Xms java虚拟机初始化时的最小内存; -Xmx java虚拟机可使用的最大内存; -XX:PermSize 它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息。

    81530发布于 2019-06-19
  • 来自专栏菩提树下的杨过

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

    mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟及json字段类型 一、先创建一个测试表: drop table if exists t_people; CREATE 四、虚拟 alter table t_people add second_name varchar(3) generated always as(substring(name,2,1)) stored ; 创建了一个虚拟second_name,其值是substring(name,2,1),即name中的第2个字,最后的stored表示,数据写入时这个的值就会计算(详情可参考最后的参考链接) 注:虚拟并不是真正的 分析执行计划,可以看到前缀索引“ix_name”生效了,但还有优化空间,仍然可以借助虚拟,创建2个虚拟phone、first_name,并创建联合索引。 profile->"$.phone") stored; alter table t_people add index ix_phone_firstname(phone,first_name); 加了这2个虚拟

    5.2K20发布于 2020-04-01
  • 来自专栏爱可生开源社区

    故障分析 | MySQL 8.0 中多字段虚拟引发的宕机

    函数 trx_undo_rec_get_multi_value 会从 Undo Log record 中构建多字段虚拟 Multi-Value Virtual Column。 https://github.com/mysql/mysql-server/commit/05c1f53be7cb8d9b527eb28e809284b0722c4106 本文关键字:#MySQL# #虚拟

    1.3K12编辑于 2024-10-29
  • 来自专栏数据库干货铺

    一文搞懂MySQL虚拟用法、选型与避坑

    今天就结合实操示例介绍虚拟的两种类型(STORED/VIRTUAL)、用法、差异,还有新手最容易踩的坑。 一、什么是MySQL虚拟虚拟,顾名思义,就是:该的值不是手动插入,而是由表内其他列计算生成的。 MySQL虚拟的逻辑完全一样,且具有如下主要特点: 无需手动插入、更新值,依赖的变化时,虚拟自动同步 表达式必须是确定性函数(输入相同,结果必相同,比如拼接、加减乘除,不能用now()之类的动态函数 虚拟依赖其他表的 虚拟的计算逻辑,只能依赖「本表的其他」,不能使用子查询、存储过程,也不能引用其他表的,否则会报错。 3. 计算逻辑是确定性的,且需要重复使用,可以考虑用虚拟。且优先选VIRTUAL,特殊场景用STORED;避开非确定性函数的坑;如非必要,不要强行用虚拟。 你在项目中用过虚拟吗?

    9510编辑于 2026-03-31
  • 来自专栏Linyb极客之路

    如何利用mysql5.7提供的虚拟来提高查询效率

    如果我们使用的mysql是5.7版本,我们则可以使用mysql5.7版本提供的一个新特性--虚拟来达到上述效果虚拟在mysql5.7支持2种虚拟virtual columns 和 stored columns g、虚拟允许修改表达式,但不允许修改存储方式(只能通过删除重新创建来修改)h、如果虚拟用作索引,会有一个缺点值会存储两次。 一次用作虚拟的值,一次用作索引中的值3、虚拟的使用场景a、虚拟可以简化和统一查询,将复杂条件定义为生成的,可以在查询时直接使用虚拟(代替视图)b、存储虚拟可以用作实例化缓存,以用于动态计算成本高昂的复杂条件 c、虚拟可以模拟功能索引,并且可以使用索引,这对与无法直接使用索引的(JSON )非常有用。 大体介绍了一下虚拟,如果是使用mysql8.0.13以上的版本,可以函数索引,他的实现方式本质也是基于虚拟实现。

    3.6K40编辑于 2022-07-12
  • 来自专栏全栈程序员必看

    用SQL语句实现:当A大于B时选择A否则选择B,当B大于C时选择B否则选择C

    数据库中有A B C三,用SQL语句实现:当A大于B时选择A否则选择B,当B大于C时选择B否则选择C

    2.6K20编辑于 2022-07-09
  • 来自专栏用户8950297的专栏

    PBI-基础入门:添加与新建(计算

    小勤:在Power BI里怎么增加一? 大海:在Power BI里增加列有2种方法,一种是咱们在学Power Query里的“添加”方法,还有一种是在PowerPivot里的新建“计算”方法。 具体操作方法如下: 在查询编辑中添加: 直接在Power BI Desktop界面中新建: 小勤:啊。Power BI真是两这个的完全组合啊。这两者之间有什么不同吗? 但在构造的时候是有以下差别的: 查询编辑器里添加用的是Power Query的知识,一般情况下,Power Query在这方面的功能比较强一些,尤其是做文本的相关处理时。 但是,新建计算的方法有个好处,是可以直接引用计算度量的相关结果,这一点是用PQ添加方法做不到的。 小勤:那该怎么决定到底用哪一种方法呢? 大海:我很少纠结这个问题,反正觉得哪个用起来方便就用哪个。 总的来说,我一般是除非要引用某些计算度量的结果或者是一些非常简单的计算,绝大部分的时候我都是用PQ进行处理的。 小勤:嗯。我大概知道了。

    8.8K30发布于 2021-08-30
  • 来自专栏前端进阶学习交流

    怎样能自动按01 02 最大为99,来设置标题?

    一、前言 前几天在Python最强王者交流群有个粉丝咨询了这个问题:获取到数据表的数比较简单,一般不超过99,怎样能自动按01 02 最大为99,来设置标题? 二、实现过程 针对这个问题,【群除我佬】给了一个代码,如下所示: ["0" + str(i) if len(str(i)) < 2 else "" + str(i) for i in range(1,100 )] 后来【~上善居士~ 郭百川】使用字符串格式化,也给了一个代码,如下所示: [f"{i:02d}" for i in range(1,100)] 后来【Eric】也给了一个可行的代码,如下所示 : columns = [] for i in range(10): columns.append(f"{i:02d}") print(columns) df.columns = ['00', (str(i)) < 2 else "" + str(i) for i in range(1,df. shape[1]+1)] [f"{i:02d}" for i in range(1,df.shape

    1.8K20编辑于 2022-12-19
  • 来自专栏用户8950297的专栏

    PQ基础-数据转换4:删、移、添加索引

    本文通过一个例子,综合体现常用的删、移、添加索引操作方法。数据样式及要求如下: 要求: 1. 删除状态; 2. 将货币移动到合同总金额的后面; 3. 添加以1为起始的索引。 Step-1:获取数据 Step-2:删除 Step-3:移动 Step-4:添加以1为开始的索引 Step-5:上载数据

    2.5K40发布于 2021-08-31
领券