• 背景

  • 测试环境

  • binlog_format为ROW

    • 测试步骤

    • 总结

  • binlog_format为STATEMENT

    • 测试步骤

    • 总结


背景

本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?

测试环境

  • MySQL5.7.25

  • Centos 7.4

binlog_format为ROW

参数

root@localhost : (none) 04:53:15> show variables like 'binlog_row_image';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| binlog_row_image | FULL  |
+------------------+-------+
1 row in set (0.00 sec)root@localhost : (none) 04:53:49> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)root@localhost : test 05:15:14> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

测试步骤

session1

root@localhost : test 04:49:48> begin;
Query OK, 0 rows affected (0.00 sec)root@localhost : test 04:49:52> select * from test where id =1;
+----+------+------+------+
| id | sid  | mid  | name |
+----+------+------+------+
|  1 |  999 |  871 | NW   |
+----+------+------+------+
1 row in set (0.00 sec)root@localhost : (none) 04:54:03> show engine innodb status\Gshow master status\G
...
---
LOG
---
Log sequence number 12090390
Log flushed up to   12090390
Pages flushed up to 12090390
Last checkpoint at  12090381
0 pending log flushes, 0 pending chkp writes
33 log i/o's done, 0.00 log i/o's/second*************************** 1. row ***************************File: mysql-bin.000001Position: 154Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

session2

root@localhost : test 04:47:45> update test set sid=55 where id =1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0root@localhost : (none) 04:54:03> show engine innodb status\Gshow master status\G
...
---
LOG
---
Log sequence number 12091486
Log flushed up to   12091486
Pages flushed up to 12091486
Last checkpoint at  12091477
0 pending log flushes, 0 pending chkp writes
39 log i/o's done, 0.00 log i/o's/second*************************** 1. row ***************************File: mysql-bin.000001Position: 500Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 row in set (0.00 sec)

session1

root@localhost : test 04:49:57> update test set sid=55 where id =1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0root@localhost : (none) 04:54:03> show engine innodb status\Gshow master status\G
...
---
LOG
---
Log sequence number 12091486
Log flushed up to   12091486
Pages flushed up to 12091486
Last checkpoint at  12091477
0 pending log flushes, 0 pending chkp writes
39 log i/o's done, 0.00 log i/o's/second*************************** 1. row ***************************File: mysql-bin.000001Position: 500Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 row in set (0.00 sec)root@localhost : test 04:52:05> select * from test where id =1;
+----+------+------+------+
| id | sid  | mid  | name |
+----+------+------+------+
|  1 |  999 |  871 | NW   |
+----+------+------+------+
1 row in set (0.00 sec)root@localhost : test 04:52:42> commit;
Query OK, 0 rows affected (0.00 sec)root@localhost : test 04:52:52> select * from test where id =1;
+----+------+------+------+
| id | sid  | mid  | name |
+----+------+------+------+
|  1 |   55 |  871 | NW   |
+----+------+------+------+
1 row in set (0.00 sec)

总结

在binlog_format=row和binlog_row_image=FULL时,由于MySQL 需要在 binlog 里面记录所有的字段,所以在读数据的时候就会把所有数据都读出来,那么重复数据的update不会执行。即MySQL 调用了 InnoDB 引擎提供的“修改为 (1,55)”这个接口,但是引擎发现值与原来相同,不更新,直接返回

binlog_format为STATEMENT

参数

root@localhost : (none) 04:53:15> show variables like 'binlog_row_image';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| binlog_row_image | FULL  |
+------------------+-------+
1 row in set (0.00 sec)root@localhost : (none) 05:16:08>  show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)root@localhost : test 05:15:14> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

测试步骤

session1

root@localhost : test 05:16:42> begin;
Query OK, 0 rows affected (0.00 sec)root@localhost : test 05:16:44> select * from test where id =1;
+----+------+------+------+
| id | sid  | mid  | name |
+----+------+------+------+
|  1 |  111 |  871 | NW   |
+----+------+------+------+
1 row in set (0.00 sec)root@localhost : (none) 05:16:51> show engine innodb status\Gshow master status\G
...
---
LOG
---
Log sequence number 12092582
Log flushed up to   12092582
Pages flushed up to 12092582
Last checkpoint at  12092573
0 pending log flushes, 0 pending chkp writes
45 log i/o's done, 0.00 log i/o's/second*************************** 1. row ***************************File: mysql-bin.000001Position: 154Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

session2

root@localhost : test 05:18:30> update test set sid=999 where id =1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0root@localhost : (none) 05:18:47> show engine innodb status\Gshow master status\G
...
---
LOG
---
Log sequence number 12093678
Log flushed up to   12093678
Pages flushed up to 12093678
Last checkpoint at  12093669
0 pending log flushes, 0 pending chkp writes
51 log i/o's done, 0.14 log i/o's/second*************************** 1. row ***************************File: mysql-bin.000001Position: 438Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 row in set (0.00 sec)

session1

root@localhost : test 05:16:47> update test set sid=999 where id =1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0root@localhost : (none) 05:20:03> show engine innodb status\Gshow master status\G
...
---
LOG
---
Log sequence number 12094504
Log flushed up to   12094504
Pages flushed up to 12094504
Last checkpoint at  12094495
0 pending log flushes, 0 pending chkp writes
56 log i/o's done, 0.00 log i/o's/second*************************** 1. row ***************************File: mysql-bin.000001Position: 438Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 row in set (0.00 sec)root@localhost : test 05:19:33> select * from test where id =1;
+----+------+------+------+
| id | sid  | mid  | name |
+----+------+------+------+
|  1 |  999 |  871 | NW   |
+----+------+------+------+
1 row in set (0.00 sec)root@localhost : test 05:20:44> commit;
Query OK, 0 rows affected (0.01 sec)root@localhost : test 05:20:57> select * from test where id =1;
+----+------+------+------+
| id | sid  | mid  | name |
+----+------+------+------+
|  1 |  999 |  871 | NW   |
+----+------+------+------+
1 row in set (0.00 sec)

总结

在binlog_format=statement和binlog_row_image=FULL时,InnoDB内部认真执行了update语句,即“把这个值修改成 (1,999)“这个操作,该加锁的加锁,该更新的更新。

来源:zhuanlan.zhihu.com/p/59717198

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

知乎高赞:当update修改数据与原数据相同时会再次执行吗?相关推荐

  1. 知乎高赞,6款办公工具,小白逆袭成职场大神

    与其想着加班到几点,不如考虑如何做到上班高效"摸鱼",下班准点回家,工资还能往上涨! 今天小编为大家找到了知乎高赞的6款实用工具推荐,办公不翻车,小白逆袭成职场大神. 01.ppt ...

  2. “2021知乎高赞好物100”榜单揭晓 知乎为美好生活奉上参考答案

    10月26日,"2021知乎高赞好物100"榜单正式揭晓,上榜商品均在知乎有着较高搜索.热度和销量.榜单涉及食品.家居.休闲娱乐.美妆.数码3C等各品类好物,由各个相关领域的专业知 ...

  3. 5款知乎高赞的超牛软件,你一定要知道

    你的电脑上有哪些宝藏实用软件?今天来给大家分享5款知乎高赞的超牛软件,你一定要知道! 先收藏后评论!良心单品多多! Notion Notion是一款老牌的高质量个人知识管理软件. 它高效地帮助用户安排 ...

  4. 爬取知乎高赞情话,甜蜜过七夕

    又是一年一度的七夕情人节了! 有女朋友的就牵好手,有男朋友的就抱紧腿,什么都么得的小伙伴就带好装备,静静的吃狗粮就ok了. 在这个到处都冒着粉红泡泡的日子,不做点什么都不太好意思. 作为一名合格的代码 ...

  5. 读书笔记第一篇:知乎高赞回答

    自从今年以来,生活发生了极大变化,自己也进入了30大关,开始奔四了.最近总觉得自己一事无成,无论物质还是精神上都没有得到满足,而且自己一个游戏程序员,越来越觉得逐渐被淘汰.所以想到的第一个挣扎的办法, ...

  6. 知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)

    知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问"中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?" 事实上,还不少呢~ 本人于201 ...

  7. 知乎高赞:35岁失业的程序员,都去了哪儿?

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨临公子 来源丨临公子的后花园(ID:hi-li ...

  8. 为啥程序员撕996建筑人不撕007?——晒知乎高赞沙雕回答,和说说工程师文化

    轻友们大家好~我是珍妮兔,一只工程效率顾问.我的日常生活是在不同的软件研发团队和大家聊天,给大家分享各种轻松把软件做好的最佳实践.如果你有特别想要解决的问题,不妨加我的个人微信:jenny1652告诉 ...

  9. MySQL中,当update修改数据与原数据相同时会再次执行吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:powdba https://yq.aliyun.com/a ...

  10. 知乎高赞 | Go 技术一面一般考哪些内容

    这两天在知乎看到一个问题:如果你是一个Golang面试官,你会问哪些问题? 高赞回答是一位来自百度的工程师给出的答案,我觉得给出的考察点很到位,如果有准备面试的小伙伴可以按照这些考察点准备面试前要学习 ...

最新文章

  1. 调整代码生成工具Database2Sharp的Winform界面生成,使其易于列表工具栏的使用。...
  2. 线性回归和logistic回归
  3. 基于多任务学习和负反馈的深度召回模型
  4. python 代码文件路径注意事项
  5. PHP7.2的安装与配置(win7)
  6. 实战:RedisCluster搭建和扩容(伪集群:4主4从)
  7. pattern recognition and machine learning基本思想1:最大似然估计
  8. win7变成xp风格了怎么改回_让电脑提速的几种方法(老电脑太卡怎么提速)
  9. 谷歌、Facebook 大规模宕机!“裸奔时代”程序员该怎么办?
  10. MySQL增量备份恢复和基于时间点与位置的恢复
  11. iOS 录音及播放 音波图波形
  12. 通用的业务编码规则设计实现
  13. jQuery版本低引起的漏洞——CVE-2020-11022/CVE-2020-11023
  14. python单例模式数据库连接池_Python单例模式的实现
  15. 袁老走好,谢谢您!我辈也当自强。
  16. opencv附加依赖项
  17. java程序设计实用教程_清华大学出版社-图书详情-《Java程序设计实用教程》
  18. android有什么作用,Android 7.0有什么功能 Android N完整功能参数介绍
  19. 这个商业模式、盈利模式、谈判技巧值得借鉴!
  20. 社区儿童计算机活动总结,幼儿园与社区活动总结

热门文章

  1. 什么是 Hadoop 生态系统
  2. [MVC学习笔记]4.使用Log4Net来进行错误日志的记录
  3. 浅谈Linux用户权限管理之三(文件与权限的设定)
  4. DOS批处理高级教程:第二章 DOS循环for命令详解(转)
  5. ORACLE10G让空间管理变轻松【SPACE MANAGEMENT MAKE EASILY ON ORACLE10G】
  6. 苹果mac交互原型设计软件:Axure RP
  7. Illustrator 教程,如何在 Illustrator 中创建色板?
  8. 如何自动清理从 Mac 到 Dropbox 的屏幕截图?
  9. 如何将PDF转成Excel格式?
  10. ios开发之cocoapods导入新三方库报错RuntimeError - [Xcodeproj] Unknown object version.