问题是关于 MySQL InnoDB 表中同时 SELECT 和 UPDATE 的行为:
我们有一个相对较大的表,我们定期扫描该表以读取多个字段,包括一个名为 LastUpdate 的字段。在扫描期间,我们更新以前扫描的行。更新在后台线程中分批执行 - 使用不同的连接。重要的是要注意我们更新已经读取的行。
三个问题:
SELECT
由于仍在进行中,InnoDB 是否会保存更新行的先前版本?- 会使用
READ-UNCOMMITTED
帮助SELECT
吗? - 我如何确认 InnoDB 在其重做日志中保存或不保存修改行的先前版本。
InnoDB 始终保存该行的先前版本。一切都是写时复制,因此每次更新都是选择 -> 复制 -> 写入。保存多长时间取决于
清除行为在最新版本中得到了很大改进。如果您有兴趣,请查看 dev.mysql.com 以获取更多信息。
我不确定你所说的帮助是什么意思。你先阅读然后更新,所以我看不出有什么好处。您很可能不想低于 READ-COMMITTED 隔离级别。这已经消除了很多锁定问题(间隙锁和下一键锁定)。
InnoDB 重做日志包含innodb 表空间中发生的所有更改,以便在系统出现故障时能够恢复。格式为:页指针偏移量和改变的字节数。因此,如果以前的版本被写入撤消空间(它是),那么要回答明确的用例,那么 InnoDB 也会将该更改写入日志文件。
我希望这有帮助!
如果你想查看更多细节,我总是建议人们使用innodb_ruby,这是一个非常方便的工具,可以查看 innodb 文件并了解操作的基本原理。