什么是mysql的虚拟列以及应用实例

简介

MySQL的虚拟列是一种新特性,可以在查询时直接使用虚拟列(代替视图) 存储虚拟列可以用作实例化缓存,以用于动态计算成本高昂的复杂条件。虚拟列可以在创建表时定义,并在查询时像普通列一样使用。虚拟列通常用于计算或汇总数据,例如计算总价、计算平均值等。

定义MySQL虚拟列(generated-columns)是MySQL 5.7加入的新特性。从名字来讲,“生成的字段”,并不是主动插入的值。MySQL的文档,是这么解释虚拟列的:There are two kinds of Generated Columns: virtual (default) and store-generated (non-default). Virtual columns are generated on the fly as part of an INSERT or UPDATE statement, and they are not stored in the table. Stored-generated columns are calculated based on the values of other columns and are stored in the table.

虚拟列的分类

在MySQL中,虚拟列有两种类型:STORED和VIRTUAL,分别表示存储列和虚拟列。

  • 存储列(STORED):表示虚拟列的值实际上是被计算出来并存储在表中的,可以在查询时直接使用。存储列的优点是它们可以被索引,这意味着它们可以更快地被搜索,但是它们也会占用更多的存储空间。存储列的值在数据插入或更新时动态计算,并存储在表中。

其中的公式为:

alter table table_name
    modify column_name int as (表达式) stored;

AS (表达式):定义该列为虚拟列,并指定其值的计算方式。表达式是一个SQL表达式,用于计算虚拟列的值。

STORED:表示该虚拟列的值会被计算出来并存储在表中。

  • 虚拟列(VIRTUAL):表示虚拟列的值不会存储在表中,而是在查询时动态计算。虚拟列的优点是它们不会占用额外的存储空间,但是它们不能被索引,因此在大型表中使用虚拟列时需要谨慎,否则可能会影响查询性能。 在上述SQL语句中,使用了STORED关键字表示该虚拟列的值会被计算出来并存储在表中。因此,每次查询表时,MySQL都会返回存储在表中的虚拟列值,而不是在查询时计算虚拟列的值。

其中公式为:

alter table table_name
    add column_name int as (表达式);

AS (表达式):定义该列为虚拟列,并指定其值的计算方式。表达式是一个SQL表达式,用于计算虚拟列的值。

虚拟列使用示例

1.创建数据库mydb,创建用户表并插入数据

create database mydb;
use mydb;
create table t_user
(
    id          bigint auto_increment
        primary key,
    name        varchar(255)  null,
    age         int default 0 null
);
INSERT INTO mydb.t_user (name, age) VALUES ('小明', 12)
INSERT INTO mydb.t_user (name, age) VALUES ('小红', 18)

插入两条数据。

2.创建虚拟存储列

alter table mydb.t_user
    add store_age int as (age + 9) stored;

创建了store_age的虚拟存储列,以age为标准加9.

展示效果

idnameagestore_age
1小明1221
2小红1827

可以看到store_age的数据都是在age的基础上加了9

3.创建虚拟列

alter table mydb.t_user
    add virtual_age int as (age + 87);

创建了virtual_age的虚拟列,以age为标准加87.

展示效果

idnameagestore_agevirtual_age
1小明122199
2小红1827105

可以看到virtual_age的数据都是在age的基础上加了87.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQL 分区必须是主键中的一个,因为主键是唯一标识一条记录的关键字,如果分区不是主键中的一个,那么可能会出现重复的分区,导致数据不一致。同时,将主键作为分区还能够提高查询效率,因为分区能够快速定位到数据所在的分区。 ### 回答2: 在MySQL中,分区是用来将大型表拆分为更小的、易于管理的部分的一种方法。而分区是一种指定如何将表拆分成分区的方式。为什么MySQL中的分区必须是主键中的一个呢? 首先,主键是用来唯一标识表中的每一条记录的。由于分区是用来将表拆分为多个较小的部分,每个部分中的记录数应该相对较少,这样可以提高查询性能。而主键作为唯一标识,保证了每个记录都有一个唯一的标识符,这样可以确保分区的准确性和一致性。 其次,MySQL利用分区来进行查询优化。通过将表拆分为多个分区,可以让查询只在特定的分区上进行,而不需要扫描整个表。这样可以大大提高查询效率。而主键作为唯一标识,在查询过程中可以帮助MySQL确定查询的范围,从而缩小搜索空间,提高查询效率。 此外,MySQL中的分区还支持分区交换操作。通过分区交换,可以在不影响其他分区的情况下,将某个分区的数据与另一个空分区进行交换。这在数据归档、数据删除等场景中非常有用。而主键作为唯一标识,可以确保交换操作的准确性和一致性。 综上所述,MySQL中的分区必须是主键中的一个,是为了保证分区的准确性、一致性,提高查询性能,并支持分区交换操作。 ### 回答3: MySQL的分区是一种将大的表拆分成小的独立分区,并分散存储在不同物理位置上的技术。为了实现分区的高效、可行,MySQL要求分区必须是主键中的一个。以下是为什么要求分区是主键中的一个的原因: 1. 查询性能优化:主键是表上的唯一标识,基于主键的查询效率往往更高。根据分区进行查询时,MySQL能够通过在具体分区上执行查询,从而减少扫描的数据量和减少磁盘IO数量,提高查询的性能。 2. 分区策略简化:以主键作为分区可以简化分区策略的设计和实施。主键是表上的唯一标识,根据主键值可以方便地将数据分配到相应的分区上。相比其他作为分区,使用主键作为分区可以降低分区管理和维护的复杂性。 3. 数据一致性保证:将分区设为主键,可以确保在表中插入或删除数据时,保持数据的一致性。分区作为主键后,MySQL会对分区键进行检查以确保每个分区中的数据唯一。这有助于避免数据重复或数据丢失的情况。 总之,MySQL要求分区必须是主键中的一个,是为了提高查询性能、简化分区策略和保证数据一致性。这样设计可以使分区功能有效地应用于大型表,提高数据库的处理能力和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不可大东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值