Bootstrap

MySQL入门学习-设计优化.生成列

       在 MySQL 中,生成列(Generated Column)是一种特殊的列类型,它的值是根据其他列的值或表达式计算得到的。生成列可以分为两种类型:存储生成列(Stored Generated Column)和虚拟生成列(Virtual Generated Column)。

一、特点和使用方法:

1. 存储生成列:

    - 特点:

       实际存储在表中的值是根据指定的表达式计算得到的。这会增加数据插入和更新的时间成本,但在查询时可以直接使用该列的值,提高查询性能。

    - 使用方法:

        CREATE TABLE your_table (
            id INT PRIMARY KEY,
            column1 INT,
            column2 INT,
            generated_column1 INT GENERATED ALWAYS AS (column1 + column2) STORED
        );


    - 在上述示例中,'generated_column1' 是一个存储生成列,其值是 'column1' 和 'column2' 的和。

2. 虚拟生成列:

    - 特点:

       值是在查询时根据表达式动态计算的,不会实际存储在表中。这可以节省存储空间,但在查询时需要额外的计算成本。

    - 使用方法:

        CREATE TABLE your_table (
            id INT PRIMARY KEY,
            column1 INT,
            column2 INT,
            generated_column2 INT GENERATED ALWAYS AS (column1 * column2) VIRTUAL
        );


    - 在上述示例中,'generated_column2' 是一个虚拟生成列,其值是 'column1' 和 'column2' 的乘积。

二、与其他设计优化的比较:

       1. 与普通列相比,生成列可以根据其他列的值自动计算,减少了数据冗余和数据不一致的风险。
       2. 与索引相比,生成列可以根据复杂的表达式计算值,而索引通常只能基于单个列或几个列的简单组合。
       3. 与视图相比,生成列的值是实际存储在表中的,查询时不需要额外的连接操作,性能可能更好。

三、高级应用:

       1. 可以用于数据验证和约束,例如可以创建一个生成列来检查某个值是否在特定范围内。
       2. 可以用于提高查询性能,特别是在需要频繁使用某个表达式计算结果的情况下。

       以下是一个完整的示例,展示了如何创建和使用生成列:

-- 创建表,包含存储生成列和虚拟生成列
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    price DECIMAL(10, 2),
    quantity INT,
    total_price DECIMAL(10, 2) GENERATED ALWAYS AS (price * quantity) STORED,
    discount_price DECIMAL(10, 2) GENERATED ALWAYS AS (price * 0.9) VIRTUAL
);

-- 插入数据
INSERT INTO products (price, quantity)
VALUES (10.00, 5), (20.00, 3), (30.00, 2);

-- 查询数据,包括生成列的值
SELECT id, price, quantity, total_price, discount_price
FROM products;

       在上述示例中,我们创建了一个名为 'products' 的表,其中包含了价格('price')、数量('quantity')、总价('total_price',存储生成列)和折扣价('discount_price',虚拟生成列)。然后,我们插入了一些数据,并查询了所有列的值,包括生成列的值。
(文章为作者在学习MySQL过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

;