Mysql虚拟列(计算列)

54 阅读1分钟

语法

col_name data_type [GENERATED ALWAYS] AS (expr)
  [VIRTUAL | STORED] [NOT NULL | NULL]
  [UNIQUE [KEY]] [[PRIMARY] KEY]
  [COMMENT 'string']

使用场景

  1. 简化统一查询
  2. 可以用作复杂条件下的物化缓存
  3. 模拟函数索引

示例

  1. 对表user3的createdate添加虚拟列v_year,以%Y-%m-%d格式存储数据
mysql> alter table user3 add column v_year date generated always as (date_format(createdate, '%Y-%m-d%'));
  1. 对虚拟列添加索引
mysql> alter table user3 add index idx_v_year(v_year);
  1. 使用虚拟列做为查询条件查询数据
mysql> explain SELECT * from user3 where v_year > '2023-10-01';
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | user3 | NULL       | range | idx_v_year    | idx_v_year | 4       | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
1 row in set (0.01 sec)