我们假设我有一个表t
,其中包含4个普通列n1
,n2
,n3
,n4
和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子句)并且它非常慢(与其他类似的表相比)。我没有选择计算列,但我猜它仍在计算中,导致速度慢。
答案 0 :(得分:0)
根据列定义中包含的表达式计算其值的列。列值不会被存储,但会在读取行时立即计算,在任何 BEFORE
触发器之后。虚拟列不占用存储空间。
InnoDB 支持生成的虚拟列上的二级索引。
VIRTUAL:不存储列值,而是在读取行时虚拟地评估列值,这与 STORED 列不同,其中值被评估和存储,因此需要磁盘空间。 VIRTUAL 每次都被评估
select n1, n2 from t;
<块引用>
此处 n1 和 n2 是 VIRTUAL 列。它们不会被存储,而只会在查询结果持续存在之前使用。它的临时存储
总结
INPLACE
操作,这意味着无需重新复制所有数据即可更改表定义。