MySQL虚拟列的使用示例

 更新时间:2024年11月11日 09:48:22   作者:xixingzhe2  
虚拟列是MySQL中的一种特殊列,它不存储在表中,而是在查询时动态计算生成,虚拟列可以提高查询效率、减少存储需求、确保数据一致性、简化查询和保护敏感数据,感兴趣的可以了解一下

1、概述

在 MySQL 中,虚拟列(也称为计算列或生成列)是一种特殊的列,它不存储在数据库表中,而是在查询时动态计算生成。虚拟列可以基于表中的其他列进行计算,或者直接计算出一些值。它们在数据库设计和查询优化中有一些重要的用途:

  • 减少存储需求:由于虚拟列不存储在磁盘上,因此可以减少数据库的存储需求。

  • 提高查询效率:虚拟列在查询时动态生成,可以减少对原始数据的计算,从而提高查询效率。

  • 数据一致性:虚拟列可以确保数据的一致性,因为它们总是基于表中其他列的最新值进行计算。

  • 简化查询:虚拟列可以简化复杂的 SQL 查询,使得查询更易于编写和理解。

  • 数据保护:虚拟列可以用于保护敏感数据,例如,通过计算列来显示部分数据,而实际数据存储在其他列中。

在 MySQL 中,虚拟列可以是存储的(STORED)或非存储的(VIRTUAL)。存储的虚拟列实际上会存储在表中,而非存储的虚拟列则不会存储,仅在查询时计算。

创建虚拟列的语法

以下是创建虚拟列的基本语法:

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    virtual_column AS (expression),
    ...
);

或者在现有的表中添加虚拟列:

ALTER TABLE table_name
ADD COLUMN virtual_column AS (expression);

2、示例

表结构

假设有一个员工表 employees,包含员工的姓名、年龄和出生日期:

CREATE TABLE `employee` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `birth_date` date DEFAULT NULL,
  `full_name` varchar(255) GENERATED ALWAYS AS (concat(`name`,_utf8mb4' (',`age`,_utf8mb4' years old)')) VIRTUAL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工';

在这个例子中,full_name 是一个虚拟列,它将员工的姓名和年龄结合起来生成一个完整的名称。

初始化数据

INSERT INTO `employee` VALUES (1, 'Lois Simpson', 12, '2022-12-19', DEFAULT);
INSERT INTO `employee` VALUES (2, 'Nakagawa Sakura', 11, '2021-01-23', DEFAULT);
INSERT INTO `employee` VALUES (3, 'Xiang Rui', 10, '2013-04-04', DEFAULT);
INSERT INTO `employee` VALUES (4, 'Ono Momoe', 11, '2002-07-07', DEFAULT);
INSERT INTO `employee` VALUES (5, 'Fukuda Sara', 11, '2020-12-04', DEFAULT);
INSERT INTO `employee` VALUES (6, 'Ryan Dunn', 11, '2021-11-01', DEFAULT);
INSERT INTO `employee` VALUES (7, 'Ku Tsz Hin', 11, '2004-10-31', DEFAULT);
INSERT INTO `employee` VALUES (8, 'Todd Diaz', 11, '2023-05-11', DEFAULT);
INSERT INTO `employee` VALUES (9, 'Yamada Kenta', 11, '2015-06-15', DEFAULT);
INSERT INTO `employee` VALUES (10, 'Leslie Anderson', 5, '2010-08-19', DEFAULT);

查询

注意事项

  • 虚拟列的计算不能依赖于其他表的数据。
  • 虚拟列不能用作存储过程或触发器的参数。
  • 虚拟列不能用于外键约束。

通过这些功能,虚拟列在数据库设计和优化中提供了一种灵活且强大的工具。

3、优缺点

优点

  • 数据一致性

    • 虚拟列的值总是基于表中其他列的当前值计算,确保数据的一致性。
  • 减少存储需求

    • 非存储的虚拟列不需要额外的存储空间,因为它们在查询时动态计算。
  • 简化查询

    • 通过将复杂的计算逻辑封装在数据库中,可以简化应用层的代码和查询语句。
  • 提高查询效率

    • 对于存储的虚拟列,如果这些列经常被查询使用,将它们存储在数据库中可以减少计算时间和提高查询效率。
  • 数据保护

    • 可以利用虚拟列显示部分数据或进行数据格式化,从而保护敏感信息。
  • 业务逻辑封装

    • 将某些业务逻辑封装在数据库层面,减少应用层的计算负担,有助于保持代码的整洁和一致性。

缺点

  • 增加计算负担

    • 每次查询时都需要重新计算非存储的虚拟列,这可能会增加数据库的计算负担,特别是在高并发环境中。
  • 限制使用

    • 虚拟列不能用作外键、存储过程参数或触发器参数,这限制了它们的使用场景。
  • 索引复杂性

    • 虽然可以为存储的虚拟列创建索引,但索引的维护可能会增加额外的复杂性和开销。
  • 存储需求

    • 存储的虚拟列需要额外的存储空间,这可能会增加数据库的存储需求。
  • 更新复杂性

    • 如果虚拟列依赖于其他列,当这些列被更新时,虚拟列的值也需要重新计算,这可能会影响更新操作的性能。
  • 数据冗余

    • 存储的虚拟列可能会引入数据冗余,尤其是在数据频繁更新的情况下,这可能会导致数据不一致的风险。
  • 限制灵活性

    • 虚拟列的计算逻辑在创建时固定,修改这些逻辑可能需要重新设计和调整数据库结构。

到此这篇关于MySQL虚拟列的使用示例的文章就介绍到这了,更多相关MySQL虚拟列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • MYSQL中的json数据操作代码

    MYSQL中的json数据操作代码

    这篇文章主要介绍了MYSQL中的json数据操作,主要包括基础查询操作,JSON函数操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • MySQL数据库迁移data文件夹位置详细步骤

    MySQL数据库迁移data文件夹位置详细步骤

    这篇文章主要介绍了MySQL数据库迁移data文件夹详细步骤,需要的朋友可以参考下
    2014-03-03
  • MySQL 使用索引扫描进行排序

    MySQL 使用索引扫描进行排序

    mysql可以使用同一个索引既满足排序,又用于查找行,因此,如果可能,设计索引时应该尽可能地同时满足这两种任务,这样是最好的。本文将介绍如何利用索引来进行排序
    2021-06-06
  • MySQL进行大数据量分页的优化技巧分享

    MySQL进行大数据量分页的优化技巧分享

    mysql大数据量分页情况下性能会很差,所以本文就来讲一讲mysql大数据量下偏移量很大,性能很差的问题,并附上解决方式,希望对大家有所帮助
    2024-01-01
  • MySql 5.6.14 winx64配置方法(免安装版)

    MySql 5.6.14 winx64配置方法(免安装版)

    这篇文章主要介绍了MySql 5.6.14 winx64配置方法(免安装版)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • mysql 存储过程判断重复的不插入数据

    mysql 存储过程判断重复的不插入数据

    这篇文章主要介绍了下面是一个较常见的场景,判断表中某列是否存在某值,如果存在执行某操作,需要的朋友可以参考下
    2017-01-01
  • MySQL 建表的优化策略 小结

    MySQL 建表的优化策略 小结

    mysql 数据库建表经验总结,用做优化表结构的参考
    2009-09-09
  • mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    这篇文章主要介绍了mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存),需要的朋友可以参考下
    2016-05-05
  • mysql主从复制配置过程

    mysql主从复制配置过程

    网站面临大流量的情况下,数据库读写成了性能瓶颈。除了使用多级缓存外,进行数据读写分离,也是提高网站承载能力重要的手段。本文介绍mysql读写分离、mysql主从复制配置过程。
    2020-09-09
  • 详解监听MySQL的binlog日志工具分析:Canal

    详解监听MySQL的binlog日志工具分析:Canal

    Canal主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费,目前主要支持MySQL。接下来通过本文给大家介绍监听MySQL的binlog日志工具分析:Canal的相关知识,感兴趣的朋友一起看看吧
    2020-10-10

最新评论