在 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
列是一个虚拟列,通过 price
和 discount
列的值进行计算得出。每次查询 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
列是一个存储列,通过 quantity
和 price
列的值进行计算得出。存储列的值会在插入数据时计算一次,并且存储在磁盘上。每次查询 total_price
列时,MySQL 都会直接读取存储的值,无需进行实时计算。
总结起来,VIRTUAL 虚拟列在每次查询时动态计算值,不占用存储空间,而 STORED 虚拟列在写入数据时计算一次并存储值,适用于频繁查询的场景,可以提高查询性能。选择使用哪种虚拟列类型取决于具体的业务需求和性能优化考虑。