技术文摘
MySQL 存储生成列和虚拟生成列的差异
MySQL 存储生成列和虚拟生成列的差异
在MySQL数据库中,生成列是一项强大的功能,它允许根据表中其他列的值自动计算出一个新列的值。而生成列又分为存储生成列和虚拟生成列,理解它们之间的差异对于优化数据库设计和性能至关重要。
存储生成列,简单来说,会将计算结果实际存储在磁盘上。当表中的数据发生变化时,MySQL会自动更新存储生成列的值。这意味着在查询时,可以直接从磁盘读取该列的值,无需实时计算,从而显著提高查询性能。例如,在一个电商订单表中,有“商品单价”“商品数量”列,若创建一个存储生成列“订单总价”,它会实时存储计算后的总价。在查询订单信息时,直接读取“订单总价”列,速度更快。不过,存储生成列会占用额外的磁盘空间,因为要存储计算结果。并且,每次数据更新时,除了更新基础列,还要更新存储生成列,这会带来一定的写入开销。
虚拟生成列则不同,它并不实际存储在磁盘上,而是在查询时动态计算。虚拟生成列依赖于基础列,在查询执行期间,MySQL根据基础列的值实时计算虚拟生成列的值。这就节省了磁盘空间,对于数据量庞大的表,优势明显。例如在一个用户信息表中,有“出生日期”列,若创建一个虚拟生成列“年龄”,每次查询时根据当前日期和出生日期计算年龄。但由于每次查询都要计算,虚拟生成列的查询性能相对较低,特别是在高并发查询环境下,可能会成为性能瓶颈。
存储生成列适合于需要频繁查询且对查询性能要求极高的场景,即使会占用一定磁盘空间和带来写入开销也在所不惜。而虚拟生成列更适用于节省磁盘空间,且对查询性能要求不是特别苛刻的场景。在实际的数据库设计中,应根据具体业务需求、数据量大小以及性能要求等因素,谨慎选择使用存储生成列还是虚拟生成列,以实现最佳的数据库性能和资源利用。
TAGS: MySQL存储 MySQL存储生成列 虚拟生成列 生成列差异对比
- SQLAlchemy 中怎样指定查询字段名
- MySQL update join 语句中使用 order by 会致使程序崩溃吗
- PHP 8.0 中 @ 错误抑制符失效及致命错误无法隐藏的原因
- Docker-Compose 部署 MySQL 时出错该如何排查
- MySQL 8.0 中 mysqldump 命令导入数据失败的原因
- MySQL 5.7 中怎样统计 JSON 数组里特定元素的使用次数
- 并发请求场景中数据库锁问题:缓存删除与数据库更新的先后顺序
- 怎样降低图片存储于 OSS 的成本并防止盗刷
- OSS 存储图片:流量计费、安全防范、压缩方式等问题解析
- LIKE 查询中如何包含特殊字符 `` 和 `"`
- 怎样高效获取用户授权分级结构并支持分页查询
- MyBatis 中怎样对比 Java 类型和 MySQL datetime 类型的大小
- MySQL 里 IS TRUE 与 =True 结果不同的原因
- PHP 8.0 中 @ 抑制符为何无法隐藏 Fatal 级别错误
- 如何优化大数据量多列求和查询