20分钟了解MySQL Generated Column
什么是Generated Column
MySQL在5.7版本引入了Generated Column,单从名字上来看有“产生”的意思。下面我们先通过一个例子来直观感受一下什么是Generated Column。
想象一下我们的客户是一家五金店铺,需要统计每天店里部件的销售情况,我们设计了这样一张的表:

表里的数据:

现在我们要统计锤子、锯子、卷尺、油漆4样商品在2019-01-20日的销售总额要怎么做?这里有一个简单的SQL:

那换成Generated Column要怎么实现?首先我们需要在表上增加Generated Column。

我们再查询一次表格试试:

可以看到查询结果中多了一列total,它的值是通过表达式(unit_price * amount)计算得出。由此可见,Generated Column的值来源于表达式,可以用于简化我们的查询语句。
Generated Column的分类
从MySQL 官方文档中可以看到,Generated Column的创建语法是:

Generated Column可以分为两类,Virtual和Stored。默认情况下不声明类型创建的是Virtual Generated Column,也就是在网上经常能看到的“虚拟列”。Virtual类型会在每次Select查询时计算Generated Column的值,而Stored类型会在插入/更新数据时,变更Generated Column值并持久化。网上有不少文章都说Stored与Virtual相比没有任何优势,这里引用MySQL文档中的一段内容,其实Stored可以充当复杂计算的的缓存:

Generated Column索引
现在我们用Generated Column来查询当日销售量大于5且销售总额大于80的商品,我们看一下它的执行计划是什么样的。

从查询计划中可以看到,这次查询是一个全表扫描。我们给amount和total字段加个索引试试。

再次执行SQL可以看到索引已经生效,Generated Column可以和普通字段一起构造索引:

小结
今天给大家简单介绍了Generated Column,下次会结合JSON字段介绍如何用Generated Column实现JSON字段的检索。