关于 MySQL 的 update,我晕了,求高手解惑

2016-07-29 19:40:01 +08:00
 stabc
首先,我们都知道 Postgres 在 update 一行时,哪怕只更新一个字段, Postgres 都会物理上新增一整个行,废弃旧行。
问题是, MySQL 的 innoDB 引擎下,同样只更新一行里的一个字段,我看到有的资料说,如果更新字段没超出原大小,就只更新该字段。 而另一个说法是,无论更新字段多大,都会像 Postgres 一样新增一整个新行,废弃旧行,区别只是对索引的更新没那么复杂。我想知道到底哪个正确?官方文档也没搜到详细解释。

我说的有点乱,说简单点,举个例子:
update articles set read=read+1 where id=5
MySQL 执行这个语句执行时,会在系统内部(对用户透明)生成一个新行么?
1659 次点击
所在节点    问与答
8 条回复
miaoever
2016-07-29 19:44:20 +08:00
stabc
2016-07-29 19:56:53 +08:00
@miaoever 我问的不是 LOCK 的问题
choury
2016-07-29 19:58:39 +08:00
不会,这叫原地更新
stabc
2016-07-29 20:27:54 +08:00
http://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html
找到了,还是会新增的。区别是 PG 新增的是新行, MYSQL 新增的是 LOG 。
miaoever
2016-07-29 20:41:06 +08:00
@stabc MVCC 的作用不是用来 “区别只是对索引的更新没那么复杂” 的。
stabc
2016-07-29 20:57:05 +08:00
@miaoever 当然不是。我也不知道你说这话逻辑在哪里。 PG 不用 MVCC ?
wander2008
2016-07-29 21:54:47 +08:00
@stabc 😓。 mysql 就是靠 binlog 来同步数据的
stabc
2016-07-30 07:13:32 +08:00
@wander2008 跟 binlog 没关系。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295869

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX