戳蓝字「TopCoder」关注我们哦!

平常使用 mysql ,必不可少的会用到 update 语句,不知道小伙伴有没有这样的疑问?

如果 update 语句和原数据一样会更新么?更具体的来说,如果更新的数据前后是一样的,MySQL 会更新存储引擎中(磁盘)数据么?

关于这个问题,在分析之前我们可以思考下:update语句和原数据一样,有必要更新么?理论上来讲是没有必要的。MySQL Server 层在执行 sql 时,其实是不知道是否是一样的,因此可以猜想,如果 MySQL 已经知道原数据的话,这样可以和 update 语句做对比,这样一样的话可以不用更新了。

那么 MySQL 在执行update 语句时,什么时候会读取原数据呢?这就涉及到 binlog 的数据格式,binlog 数据格式相关配置项为binlog_format,该配置取值范围如下:

  • statement:逻辑SQL格式,通过mysqlbinlog工具可进行查看,就是sql语句;

  • row:记录的是行更改日志,对于statement格式binlog复制潜在的问题可通过row来解决;

  • mixed:默认使用statement格式,某些操作下使用row格式,比如uuid/now/user等不确定函数。

注意:在msyql 5.1版本之前默认都是基于sql语句(statement)级别的,statement格式的binlog会造成某些操作在主从复制时出现问题,比如now/rand/uuid等。

row 格式的 binlog 会记录镜像数据,针对 update 来说,必须是前镜像数据才能判断出来update 语句是否和原数据一样。针对 row 格式的镜像数据配置,由配置项binlog_row_image来决定(该配置只在 row 模式下才起作用),该配置项官方文档如下:

  1. full: Log all columns in both the before image and the after image.

  2. minimal: Log only those columns in the before image that are required to identify the row to be changed; log only those columns in the after image where a value was specified by the SQL statement, or generated by auto-increment.

  3. noblob: Log all columns (same as full), except for BLOB and TEXT columns that are not required to identify rows, or that have not changed.

简单来说,full会记录所有列,noblob会记录除blob和text外的所有列,minimal只会记录需要的列。对于insert 来说,只有后镜像没有前镜像;对于update来说,有前镜像和后镜像;对于delete来说,只有前镜像没有后镜像。对于 full 和 noblob 没有什么好说的,对于minimal来说,insert 记录所有列后镜像,update 和 delete的话要分为几种情况:

  • 当存在主键索引或者唯一索引时,update记录主键列前镜像和更新列后镜像,delete 记录主键列前镜像。

  • 只有普通二级索引时,update 记录所有列前镜像和更新列后镜像,delete 记录所有列前镜像。

针对minimal的binlog_row_image为什么要这么设计呢?有主键或者唯一键的话,可以通过其定位到唯一一条记录,因此没有必要记录整个列的镜像数据了,在只有二级索引或者其他情况下,只能记录整个列的镜像数据。

那么日常开发中,应该怎么配置binlog_row_image呢?建议配置成 full 模式,因为这样可以以空间换取更多的数据保证,可以避免binlog 的闪回功能。

回到最初提到的问题,可以知道,在binlog_format=row时,由于MySQL 需要在 binlog 里面记录数据对应字段,因此会进行数据的读取操作,此时就可以进行数据对比,重复数据的update不会执行。具体验证可以通过以下几个命令:

show master status\Gset  binlog_format ='row'; // statementshow variables like 'binlog_format';update xxx

针对 uddate 语句和原数据一样时可能不会进行更新操作,因此该场景下返回的影响行数可能为0。

 推荐阅读 

  • CompletableFuture 应用实践

  • Java线程池实现原理

  • 深入理解Java线程池

  • JMM Java内存模型

  • happens-before那些事儿

  • 为什么说LockSupport是Java并发的基石?

delete语句与reference约束冲突怎么解决_mysql update语句和原数据一样会更新么相关推荐

  1. delete语句与reference约束冲突怎么解决_一条简单的更新语句,MySQL是如何加锁的?...

    看如下一条sql语句: # table T (id int, name varchar(20)) delete from T where id = 10: MySQL在执行的过程中,是如何加锁呢?在看 ...

  2. Hibernate级联删除提示约束失败DELETE 语句与 REFERENCE 约束FK_SelectCourse_StudentInfo冲突。...

    前台执行删除带约束关系的时候,后台提示错误 Hibernate: delete from Student.dbo.StudentInfo where Snu=? 删除失败! org.hibernate ...

  3. 【牛腩】DELETE 语句与 REFERENCE 约束“FK_news_category“冲突。该冲突发生于数据库“newssystem“,表“dbo.news“, column ‘caId‘

    [前言] 牛腩中删除类别的时候会提示受到主外键的约束,导致无法删除这个类别. [问题描述] DELETE 语句与 REFERENCE 约束"FK_news_category"冲突. ...

  4. 删除作业计划出错(DELETE语句与 REFERENCE约束FK_subplan_job_id冲突。)

    删除作业计划出错 提示:DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突. 解决方案: --打开SQL查询, use msdb select * ...

  5. 【数据库】ALTER TABLE 语句与 CHECK 约束““冲突。该冲突发生于数据库““,表““, column ‘‘

    摘要:微信搜索[三桥君] 本篇讲述的是在已经创建好表且有数据的情况下,增加CHECK约束的报错问题 一.问题 当我给数据库中已经创建好的Student表,增加约束条件. --增加student表的约束 ...

  6. mysql更新代码_mysql update语句的用法

    1.    单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 .. ...

  7. mysql update用法_mysql update语句的用法详解

    首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] ...

  8. mysql更新语句用法_MySQL update 语句的正确用法

    以下的文章主要介绍的MySQL update 语句的实际用法,我们首先是以单表的UPDATE语句来引出实现MySQL update 语句的实际方案,以下就是文章的详细内容描述,望你看完之后会有收获. ...

  9. mysql的更新用法_mysql update语句的用法详解

    本节内容: mysql数据库中的update语句. 首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr ...

最新文章

  1. 自己写编译器学习总结
  2. Node.Js从零开始搭建数据管理后台 (一)
  3. jQuery如何使用css方法修改单个样式?
  4. python观察日志(part15)--命名元祖namedtuple
  5. 【C】KoobooJson在asp.net core中的使用
  6. 看懂 ,学会 .NET 事件的正确姿势-简单版
  7. CentOS7配置samba共享文件系统
  8. Pessimistic and Optimistic locking
  9. 使用DEVC创建C语言工程
  10. Java 实现视频裁剪(附代码) | Java工具类
  11. 微软王码五笔86版 for winnt/2000/xp v7.3 免费
  12. 苹果台式机怎么设置我的电脑计算机,怎么让台式电脑用苹果手机的wifi上网
  13. PTA L1-049 天梯赛座位分配(20分)(python)
  14. 教你如何赚取你的第一桶金 - 2048(含源码)
  15. 计算机c盘空间满了应该怎么办,C盘空间越来越小怎么办?电脑C盘满了怎么办?...
  16. 郭天祥自学单片机的方法
  17. java计算机毕业设计中国民航酒店分销系统源码+系统+lw+数据库+调试运行
  18. css图片按键变手指,CSS-悬停button标签时如何使光标变为手形
  19. 海思Hi3516CV500/Hi3516DV300处理参数比较
  20. 计算机主机与外部交换的部件是,主机与外部设备的信息交换.PPT

热门文章

  1. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第7章-二阶时滞多智能体系统分组一致性
  2. 【双边滤波】基于小波变换的多尺度自适应THZ增强双边滤波器的MATLAB仿真
  3. 六自由度高超声速飞行器的建模与控制器设计
  4. 八、TFTP服务器搭建及应用
  5. 职场10不要【来自网络】
  6. Go语言中如何进行测试
  7. EF架构~单表一对多集合的插入(树型结构)
  8. 《Hadoop MapReduce性能优化》一1.3 Hadoop MapReduce的工作原理
  9. AnjularJS笔记5--ng-repeat跟据ID判断重复性
  10. C#创建Oracle中的几何对象:点、线、面