gpt4 book ai didi

mysql - 为什么 InnoDB 在没有每次更新的情况下继续增长?

转载 作者:可可西里 更新时间:2023-11-01 07:54:48 25 4
gpt4 key购买 nike

我有一个由大量 blob 组成的表,我想对其进行一些测试。

我知道删除的空间不会被 innodb 回收,所以我决定通过更新它自己的值而不是创建新记录来重用现有记录。

但我注意到,无论是删除和插入新条目,还是对现有 ROW 进行更新,InnoDB 都在不断增长。

假设我有 100 行,每行存储 500KB 的信息,我的 InnoDB 大小是 10MB,现在当我对所有行调用 UPDATE(无插入/无删除)时,innodb 每次运行都会增长约 8MB。我所做的只是在每一行中存储恰好 500KB 的数据,几乎没有修改,并且 blob 的大小是固定的。

我能做些什么来防止这种情况发生?

我知道优化表,但我做不到,因为在正常使用情况下,该表将有 60-100GB 大,运行优化只会使整个服务器停止运行。

最佳答案

But I noticed, whether I delete and insert a new entry, or I do UPDATE on existing ROW, InnoDB keeps on growing.

InnoDB 是一个多版本系统。

这意味着每次更新或删除一行时,该行的先前版本都会被复制到一个称为回滚段 的特殊位置。原始记录被新数据重写(在 UPDATE 的情况下)或标记为已删除(在 DELETE 的情况下)。

如果您执行事务回滚或执行并发 SELECT 语句(由于新版本尚未提交,因此必须查看以前的版本),从 rollback 中检索数据段

问题在于 InnoDB 表空间从不收缩。如果表空间已满,则分配新空间。已提交事务的回滚信息占用的空间也可以重复使用,但如果表空间已满,它将被扩展,这是永久性的。

除了备份整个数据库、删除并重新创建 InnoDB 文件以及从备份中恢复之外,没有支持的方法来缩小 ibdata* 文件。

即使您使用 innodb_file_per_table 选项,回滚表空间仍存储在共享的 ibdata* 文件中。

但是请注意,表占用的空间和表空间占用的空间是不同的东西。可以通过运行 OPTIMIZE 来缩小表,这将使它们更紧凑(在表空间内),但表空间本身不能缩小。

关于mysql - 为什么 InnoDB 在没有每次更新的情况下继续增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com