我有一张由厚重的斑点组成的桌子,我想对它进行一些测试.
我知道innodb不会回收已删除的空间,所以我决定通过更新自己的值而不是创建新记录来重用现有记录.
但我注意到,无论是删除并插入新条目,还是在现有ROW上进行更新,InnoDB都在不断增长.
假设我有100行,每个存储500KB的信息,My InnoDB大小为10MB,现在当我在所有行上调用UPDATE(没有插入/不删除)时,innodb每次运行都会增加~8MB.我所做的就是每行存储500KB的数据,几乎没有修改,并且blob的大小是固定的.
我该怎么做才能防止这种情况发生?
我知道优化表,但我不能这样做,因为在常规使用,表将是60-100GB大,运行优化将停止整个服务器.
但我注意到,无论是删除并插入新条目,还是在现有ROW上进行更新,InnoDB都在不断增长.
InnoDB 是一个多元化系统.
这意味着每次更新或删除行时,行的先前版本都会复制到名为a的特殊位置rollback segment.原始记录用新数据重写(如果是UPDATE)或标记为删除(如果是a DELETE).
如果您执行事务回滚或执行并发SELECT语句(必须查看以前的版本,因为尚未提交新版本),将从中检索数据rollback segment.
这个问题是InnoDB表空间永远不会缩小.如果表空间已满,则分配新空间.来自提交事务的回滚信息占用的空间也可以被重用,但是如果表空间已满,它将被扩展并且这是永久性的.
ibdata*除了备份整个数据库,删除和重新创建InnoDB文件以及从备份还原之外,没有受支持的方法来缩小文件.
即使您使用innodb_file_per_table选项,回滚表空间仍存储在共享ibdata*文件中.
但是请注意,表空间占用的空间和表空间占用的空间是不同的东西.可以通过运行来缩小表OPTIMIZE,这将使它们更紧凑(在表空间内),但表空间本身不能缩小.
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |