Mysql MariaDB,新插入是否替换磁盘上已删除的行?

Mysql MariaDB,新插入是否替换磁盘上已删除的行?,mysql,mariadb,Mysql,Mariadb,如果有人能给我指出正确的方向,我找不到任何关于这种行为的文档 我们知道,当您从表中删除行时,最终会出现“漏洞”,您可以使用优化对其进行碎片整理。如果不使用新插件,是否会自动填充这些孔?如果没有,有没有办法强迫这种行为?使用InnoDB表循环日志、删除旧行和添加新行时,表是否会滚动或持续消耗磁盘空间?或者另一种发动机更适合这种情况 是的,我知道表分区,我想首先探讨所有选项。因为这基本上不是问题,我假设您是出于学术原因问的 InnoDB(您应该使用该引擎!)将数据(以及每个二级索引)存储在单独的B+

如果有人能给我指出正确的方向,我找不到任何关于这种行为的文档

我们知道,当您从表中删除行时,最终会出现“漏洞”,您可以使用
优化
对其进行碎片整理。如果不使用新插件,是否会自动填充这些孔?如果没有,有没有办法强迫这种行为?使用InnoDB表循环日志、删除旧行和添加新行时,表是否会滚动或持续消耗磁盘空间?或者另一种发动机更适合这种情况


是的,我知道表分区,我想首先探讨所有选项。

因为这基本上不是问题,我假设您是出于学术原因问的

InnoDB(您应该使用该引擎!)将数据(以及每个二级索引)存储在单独的B+树中

数据的B树按
主键
排序。根据插入、删除、更新(更改行长度)、行上的临时事务锁等的顺序,不同的叶节点将被不同程度地填充

最后一个原因是,一个事务可以有效地看到数据的瞬时快照,可能与另一个事务的视图不同。这意味着一行的多个副本可能共存

缓冲池包含16KB的块。每个块包含可变数量的行。这个数字随着潮汐的变化而变化。如果太多相邻的块变为“太空”,它们将被合并

完全空的块(比如,由于大量的删除)将放在一个自由链上,以便以后通过插入重用。但请注意,表使用的磁盘不会收缩

收缩失败通常不是问题——大多数表都会增长;任何收缩都会很快带来新的增长

分区通常不值得使用。但是,这是“仅保留数据90天”的最佳方法,然后使用
删除分区
,而不是使用大而慢的
删除
。(这是
分区
的唯一用途)


如果您将int(每个4字节)VARCHARs(选择平均长度)中的所有字节相加,等等,您将得到所使用的磁盘空间的一个很好的估计值。但是由于上面讨论的原因,您需要将该数字乘以2到3,以便更好地估计表实际消耗的磁盘空间。

如果行长度可变,则取决于新行是否适合任何孔。我并不希望磁盘空间会缩小,只是当删除允许新行取代它们的位置时,它将在一定的大小上均衡。只要它不继续增长,并且有一天消耗掉整个驱动器。这种理解正确吗?@Private_Citizen-正确。对于典型的活动,我提到的2x-3x即使在多年的活动之后仍然有效。(一种非典型的情况是在删除大多数行之后。)@Private_Citizen-分区技术可能对我们的用例(日志)有用。更多: