MySQL:什么时候计算虚拟生成列的值?

时间:2018-06-14 18:32:47

标签: mysql calculated-columns

我们假设我有一个表t,其中包含4个普通列n1n2n3n4和1个虚拟计算专栏,c1。如果我运行以下查询:

select n1, n2 from t;

,是为每行计算的c1的值,即使我没有将它包含在我选择的列中?

根据这里的官方MySQL文档https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html

  

VIRTUAL:不存储列值,但在行数时会对其进行求值   在任何BEFORE触发后立即读取。

它说,rows are read,而不是columns are read。因此,混乱。

实际上,这是我的实际情况: 我从上面描述的这样一个表中选择(没有where子句)并且它非常慢(与其他类似的表相比)。我没有选择计算列,但我猜它仍在计算中,导致速度慢。

1 个答案:

答案 0 :(得分:0)


MySQL 中 VIRTUAL 的定义

根据列定义中包含的表达式计算其值的列。列值不会被存储,但会在读取行时立即计算,在任何 BEFORE 触发器之后。虚拟列不占用存储空间。

<块引用>

InnoDB 支持生成的虚拟列上的二级索引。

VIRTUAL:不存储列值,而是在读取行时虚拟地评估列值,这与 STORED 列不同,其中值被评估和存储,因此需要磁盘空间。 VIRTUAL 每次都被评估

select n1, n2 from t;
<块引用>

此处 n1 和 n2 是 VIRTUAL 列。它们不会被存储,而只会在查询结果持续存在之前使用。它的临时存储


总结

  • 虚拟生成的列不会占用任何磁盘空间。
  • 虚拟生成的列是 INPLACE 操作,这意味着无需重新复制所有数据即可更改表定义。
  • 虚拟生成的列,这些值是在读取操作和 BEFORE 触发器期间即时计算的。