MySQL 删除 space 发布
MySQL DELETE space release
我了解到在mysql中执行DELETE sql不会释放space,所以我做了一个实验。
在实验过程中,我发现当我的数据量很大时(大约20000行),我删除了一半的行,数据长度并没有减少。
但是当我的数据大小约为 1000 行时,我尝试删除一半的行。没想到数据长度会减少。
真是一头雾水。我对这个问题进行了很多搜索,但一无所获。什么原因?
我的MySQL版本是5.6
InnoDB table 统计数据不会在您每次删除时更新。因此 data_length
、index_length
、rows
、average_row_length
和 data_free
可能无法始终描述 table 的精确状态。
您可能想阅读:
- https://www.percona.com/blog/2011/10/06/when-does-innodb-update-table-statistics-and-when-it-can-bite/
- https://www.percona.com/blog/2017/09/11/updating-innodb-table-statistics-manually/
即使更新了 table 统计数据,它们也不准确。它们是基于 table.
的有限样本的估计
还应该提到的是,tablespace 文件的大小保持在其高水位线,即使 data_length 已减小。不同之处在于 space 是文件系统中文件的一部分,但它不再被数据或索引占用。在进一步扩展文件之前,InnoDB 应该在 tablespace 中重用 "free" space。
我了解到在mysql中执行DELETE sql不会释放space,所以我做了一个实验。
在实验过程中,我发现当我的数据量很大时(大约20000行),我删除了一半的行,数据长度并没有减少。 但是当我的数据大小约为 1000 行时,我尝试删除一半的行。没想到数据长度会减少。
真是一头雾水。我对这个问题进行了很多搜索,但一无所获。什么原因?
我的MySQL版本是5.6
InnoDB table 统计数据不会在您每次删除时更新。因此 data_length
、index_length
、rows
、average_row_length
和 data_free
可能无法始终描述 table 的精确状态。
您可能想阅读:
- https://www.percona.com/blog/2011/10/06/when-does-innodb-update-table-statistics-and-when-it-can-bite/
- https://www.percona.com/blog/2017/09/11/updating-innodb-table-statistics-manually/
即使更新了 table 统计数据,它们也不准确。它们是基于 table.
的有限样本的估计还应该提到的是,tablespace 文件的大小保持在其高水位线,即使 data_length 已减小。不同之处在于 space 是文件系统中文件的一部分,但它不再被数据或索引占用。在进一步扩展文件之前,InnoDB 应该在 tablespace 中重用 "free" space。