当前位置: 首页 > wzjs >正文

网站备案icp过期上海有实力的seo推广咨询

网站备案icp过期,上海有实力的seo推广咨询,公司网站可以做服务器吗,纪念平台网站建设前言 最近在做订单系统重构时,遇到了一个有趣的问题。 系统里有很多地方都要计算订单的总价(数量单价),这个计算逻辑分散在各个服务中,产生了不少相似甚至重复的代码。 代码评审时,同事提出了一个建议 —…

前言

最近在做订单系统重构时,遇到了一个有趣的问题。

系统里有很多地方都要计算订单的总价(数量×单价),这个计算逻辑分散在各个服务中,产生了不少相似甚至重复的代码。

代码评审时,同事提出了一个建议 —— 使用MySQL的虚拟列来统一处理这类计算,在调研后我们一致决定采纳。

经过一段时间的生产实践,也逐渐摸清了虚拟列的套路,这里就和大家分享一下这个特性的使用心得。

耐心看完,你一定有所收获。

MySQL 5.7版本引入的虚拟列(Generated Columns)允许我们定义一个基于其他列计算得出的列。

它有点像Excel中的计算列,但更加强大和灵活。

虚拟列分为两种类型:

  1. VIRTUAL(虚拟列):在读取时实时计算,不占用存储空间
  2. STORED(存储列):在数据写入时计算并存储,会占用实际存储空间

基本语法

创建虚拟列的语法不难:

-- 例如,计算订单总价CREATE TABLE orders (quantity INT,unit_price DECIMAL(10,2),total_price DECIMAL(10,2) GENERATED ALWAYS AS (quantity * unit_price) VIRTUAL);

虚拟列还是比较好用的,但是也得注意,不是所有的场景都适合使用,这里先讲适合的。

适合使用虚拟列的场景

  1. 可以简化查询和业务操作的,避免在多个查询中重复编写相同的表达式

-- 例如,计算订单总价CREATE TABLE orders (quantity INT,unit_price DECIMAL(10,2),total_price DECIMAL(10,2) GENERATED ALWAYS AS (quantity * unit_price) VIRTUAL);
  1. 需要确保计算值始终正确且一致

-- 自动计算年龄CREATE TABLE persons (birth_date DATE,age INT GENERATED ALWAYS AS (YEAR(CURDATE()) - YEAR(birth_date)) VIRTUAL);
  1. 从JSON列中提取特定字段或者做一些判断
CREATE TABLE products (attributes JSON,product_name VARCHAR(100) GENERATED ALWAYS AS (attributes->>'$.name') VIRTUAL
);
  1. 利用虚拟列创建索引,提高查询性能

这个特性需要MySQL 8.0+


CREATE TABLE users (full_name VARCHAR(100),first_name VARCHAR(50) GENERATED ALWAYS AS (SUBSTRING_INDEX(full_name, ' ', 1)) VIRTUAL,INDEX (first_name));

不适合使用虚拟列的场景

  1. 计算成本过高、过于复杂的表达式会影响性能
  2. 频繁更新的表,则不适用VIRTUAL列,毕竟在每次查询时都会重新计算
  3. 存储空间严重受限时,谨慎使用使用STORED类型时,因为STORED列会增加存储空间
  4. MySQL 5.7 以下不支持虚拟列
  5. 计算依赖于不确定性函数(如NOW()、RAND())的,也不能使用

虚拟列的限制

  1. 不能在虚拟列中使用子查询
  2. 不能引用自增列
  3. 不能使用存储函数或用户定义的函数
  4. 不能使用不确定函数(如NOW())
  5. 不能将虚拟列作为外键
  6. 不能设置默认值

性能考虑

  1. VIRTUAL列:查询时计算,适合计算简单、不频繁查询的列
  2. STORED列:写入时计算,适合计算复杂、频繁查询的列
  3. 索引:只能在STORED列上创建索引(MySQL 8.0+支持在VIRTUAL列上创建索引)

总结

MySQL虚拟列为我们提供了一个优雅的解决方案,可以将部分计算逻辑从应用层转移到数据层,既保证了数据的一致性,又简化了应用层代码。

在我们的订单系统中,目前有不少字段都用上了虚拟列,确实代码会更加清晰,维护成本也有相应降低。

当然,是否使用虚拟列需要根据具体场景来判断。

对于简单的计算逻辑,特别是需要在多处使用的计算结果,虚拟列是个不错的选择。
但对于复杂的业务逻辑,还是建议放在应用层处理为好。

希望这篇文章能帮助大家更好地理解和使用MySQL虚拟列这个实用的特性。

如果你的项目中有类似的场景,不妨尝试一下这个功能,也欢迎使用过的朋友来交流下心得。


文章转载自:

http://uatkFLpd.qxLyf.cn
http://Oif9wFCH.qxLyf.cn
http://33g0oBhw.qxLyf.cn
http://1SSXF6go.qxLyf.cn
http://lFQ1RSWN.qxLyf.cn
http://VZeLQjG6.qxLyf.cn
http://YrdY909j.qxLyf.cn
http://83pGyx9C.qxLyf.cn
http://agAbeOPe.qxLyf.cn
http://WBDA0Lvl.qxLyf.cn
http://w06UGD6t.qxLyf.cn
http://NNCyQSoP.qxLyf.cn
http://LmYWxwKT.qxLyf.cn
http://mKbJh4Vd.qxLyf.cn
http://D0s5Zccb.qxLyf.cn
http://W1boI8TQ.qxLyf.cn
http://YSmnIGdK.qxLyf.cn
http://5pTbbQ5E.qxLyf.cn
http://sginXHuQ.qxLyf.cn
http://Y8KgKiuI.qxLyf.cn
http://vhFo03yy.qxLyf.cn
http://XxGTKrZJ.qxLyf.cn
http://YkWUZZAe.qxLyf.cn
http://VETo2jLD.qxLyf.cn
http://Powub1m7.qxLyf.cn
http://mse6uKgy.qxLyf.cn
http://jt10wDHe.qxLyf.cn
http://Qpy4e1HF.qxLyf.cn
http://u8OWbyZi.qxLyf.cn
http://WXN1v6qs.qxLyf.cn
http://www.dtcms.com/wzjs/666000.html

相关文章:

  • 高密做网站的价格自己做的网站怎么传到空间啊
  • 商贸有限公司简介兰州seo公司
  • 阿里云建站视频台州公司做网站
  • 网站系统建设招标淘宝官网首页电脑版登录
  • 兰山区建设局网站软文代写发布
  • 公司建设门户网站的总结网站设计预算
  • 自己做网站的二维码自己做的网站怎么推广
  • 西安企业模板建站足球比赛直播在哪看
  • 沈阳网站建设公众号制作相册音乐相册模板
  • 返利网 网站建设费用wix做网站的建议
  • 模具 东莞网站建设网站开发视频教程百度云
  • 网站建设谈客户说什么永久免费自助建站系统
  • phpcms v9 网站建设入门徐州网站建设策划
  • 维护一个网站的费用扁平化配色方案网站
  • 蒙牛网站建设淘宝店铺运营
  • 怎么给网站刷流量开发者模式对手机有伤害吗
  • 怎么制作手机网站平台定制鞋子的app
  • 德州核酸检测最新公告网站关键词优化到首页难度
  • 站酷官网首页网站友情链接怎么样做
  • 微网站 .net百度给做网站收费多少钱
  • 开发商城网站开发陕西建设网官方网站
  • 深圳最好的网站开发公司电话wordpress侧边小图标联系方式
  • html5网站素材手机qq网页版登录
  • 网站设计开发文档模板下载建筑网图集
  • 亚洲网站正在建设中什么是营销
  • 网站后台怎么上传文件安阳昨天发生的事件
  • net开发网站广东中山今天最新通知
  • 太仓市娄城高新建设有限公司网站千博企业网站管理系统2013
  • 建网站 就能开店网络营销案例题
  • 自己做的网站能备案cps广告联盟