MySQL:何时计算虚拟生成列的值?

eup*_*a83 5 mysql calculated-columns

假设我有一个t包含 4 个普通列n1n2n3n41 个虚拟计算列 的表c1。如果我运行以下查询:

select n1, n2 from t;
Run Code Online (Sandbox Code Playgroud)

,是为每行计算的值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 子句),并且它非常慢(与其他类似的表相比)。我没有选择计算列,但我猜测它仍在计算中,导致速度缓慢。

Dav*_*uki 1


MySQL 中 VIRTUAL 的定义

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

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

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

select n1, n2 from t;
Run Code Online (Sandbox Code Playgroud)

这里 n1 和 n2 是虚拟列。它们不会被存储,而是仅在查询结果持久存在之前使用。它的临时存储


总之

  • 虚拟生成的列不会占用任何磁盘空间。
  • 虚拟生成列是INPLACE指更改表定义而无需重新复制所有数据的操作。
  • 虚拟生成列的值是在读取操作期间和触发之前动态计算的。