在 MySQL 中,虚拟列有两种类型:VIRTUAL 和 STORED。它们在功能和使用上有一些区别。

1. VIRTUAL 虚拟列:

  • VIRTUAL 虚拟列是通过表达式动态计算得出的值,并不实际存储在磁盘上。
  • 每次查询时,虚拟列的值都会根据定义的表达式进行计算。
  • 虚拟列的值是实时计算的,不占用额外的存储空间。
  • 适用于那些能够通过其他列计算得出的值,而且计算开销较小的情况。

以下是一个示例,说明如何创建和使用 VIRTUAL 虚拟列:

CREATE TABLE products (
  id INT,
  price DECIMAL(10,2),
  discount DECIMAL(3,2),
  discounted_price DECIMAL(10,2) GENERATED ALWAYS AS (price - (price * discount)) VIRTUAL
);

INSERT INTO products (id, price, discount) VALUES (1, 100.00, 0.2);

在上面的示例中,discounted_price 列是一个虚拟列,通过 pricediscount 列的值进行计算得出。每次查询 discounted_price 列时,MySQL 都会实时计算并返回结果。

2. STORED 虚拟列:

  • STORED 虚拟列也是通过表达式计算得出的值,但与 VIRTUAL 不同,STORED 虚拟列的值在插入或更新数据时计算并存储在磁盘上。
  • 存储列的值只有在写入时计算一次,并且在查询时直接读取存储的值,不需要再进行实时计算。
  • 适用于那些频繁被查询而计算开销较高的场景,可以在写入数据时计算一次,然后在查询时直接读取存储的值,提高查询性能。

以下是一个示例,说明如何创建和使用 STORED 虚拟列:

CREATE TABLE sales (
  id INT,
  quantity INT,
  price DECIMAL(10,2),
  total_price DECIMAL(10,2) GENERATED ALWAYS AS (quantity * price) STORED
);

INSERT INTO sales (id, quantity, price) VALUES (1, 10, 5.00);

在上面的示例中,total_price 列是一个存储列,通过 quantityprice 列的值进行计算得出。存储列的值会在插入数据时计算一次,并且存储在磁盘上。每次查询 total_price 列时,MySQL 都会直接读取存储的值,无需进行实时计算。

总结起来,VIRTUAL 虚拟列在每次查询时动态计算值,不占用存储空间,而 STORED 虚拟列在写入数据时计算一次并存储值,适用于频繁查询的场景,可以提高查询性能。选择使用哪种虚拟列类型取决于具体的业务需求和性能优化考虑。