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

MySQL insert or update方式性能比较

MySQL中,有如下两种方式,哪种方式比较好?

1、先使用enterprise_id字段查询数据表,如果表中存在记录,则更新记录;如果不存在,则插入记录;

2、使用“INSERT INTO XXX ON DUPLICATE KEY UPDATE XXX”的方式;

在 MySQL 中,对于插入或更新记录的操作,选择适合的方式取决于性能、代码简洁性和维护性等因素。以下是对两种方式的比较分析:

1. 单独查询再更新或插入

实现步骤

  1. SELECT 查询 enterprise_id 是否存在。
  2. 根据查询结果决定执行 UPDATEINSERT

优点

  • 控制逻辑更清晰,灵活性更高,可以在查询和更新之间执行其他操作。

缺点

  • 性能较差:涉及两次数据库访问,尤其是在并发场景下,增加了锁等待时间和数据库负载。
  • 并发问题:可能在查询结果返回后,另一个事务插入了相同的 enterprise_id,导致 INSERT 冲突。

适用场景

  • 需要基于查询结果执行复杂的条件逻辑。
  • 并发不高或数据一致性要求不严格。

2. INSERT ... ON DUPLICATE KEY UPDATE

实现步骤

  • 直接尝试 INSERT,如果 enterprise_id 已存在,则执行 UPDATE

优点

  • 性能更优:只进行一次数据库操作,无需分离查询和更新。
  • 原子性和并发支持更好:避免了查询后插入的竞态条件。

缺点

  • 如果表的唯一索引设计不合理,可能引发意外冲突。
  • 灵活性稍差,只能执行简单的 UPDATE

适用场景

  • 高并发环境或需要较高性能。
  • 插入或更新逻辑相对简单的需求。

结论

在大多数常见场景下,INSERT ... ON DUPLICATE KEY UPDATE更推荐的方式,尤其是在高并发性能敏感的环境中。这种方式可以减少数据库访问次数,提高事务的原子性和效率。只有在逻辑复杂且无法通过 ON DUPLICATE KEY UPDATE 语法实现时,才考虑使用查询+更新/插入的方式。

综合建议
  • 使用 ON DUPLICATE KEY UPDATE,简化代码、提升性能和一致性。
  • 确保 UNIQUE 约束定义合理,以避免错误更新。

http://www.kler.cn/a/471439.html

相关文章:

  • Express 加 sqlite3 写一个简单博客
  • 使用 Conda创建新的环境遇到的问题
  • 路由器的转发表
  • 基于RedHat9部署WordPress+WooCommerce架设购物网站
  • Linux性能优化-系列文章-汇总
  • 设计模式——泛型单例类
  • javascript-闭包
  • 万能无线航模模拟器加密狗说明书
  • 25/1/7 算法笔记<强化学习> sac_learn代码拆解
  • 云安全博客阅读(二)
  • PHP语言的数据库编程
  • 调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序
  • 自定义字典转换器用于easyExcel 导入导出
  • npm-npm install时rollbackFailedOptional: verb npm-session ce210dc17dd264aa报错
  • 13个热门.Net开源项目
  • 安卓悬浮可跳动自动吸附可设置不同的吸附距离view
  • 【机器学习】机器学习的基本分类-自监督学习-自回归方法(Autoregressive Methods)
  • 计算机网络——数据链路层-流量控制和可靠传输
  • Docker - 6.设置SSH自动启动并使用root登录
  • 【工业场景】用YOLOv8实现工业配电柜开关状态识别
  • 鸿蒙ArkUI实现部门树列表
  • 入门嵌入式(四)——IICOLED
  • 用JAVA 源码角度看 客户端请求服务器流程中地址是域名情况下解析域名流程
  • CSS语言的文件操作
  • excel如何将小数转换为百分比
  • lec1-计算机概述