我尝试使用 innodb-defragment=1 https://mariadb.com/kb/en/library/defragmenting-innodb-tablespaces/对表进行碎片整理
但这是一次糟糕的经历: - 锁定表 - 没有好的碎片整理结果(表上始终没有数据)
所以我使用 percona-tools https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html
并得到一个很好的结果,没有锁,也没有更多的数据在桌子上。(但需要磁盘空间来复制表)
但是第一种方法有什么问题?
更新 :
神话终结者。
碎片整理是一个主要不适用于 InnoDB 的概念。很少值得努力使用
OPTIMIZE TABLE
或其他技术进行碎片整理。InnoDB 分片和/或拥有“可用”空间的方式有多种:
SHOW TABLE STATUS
仅显示“空闲”空间的一部分。此外,它通常会指示 4/5/6/7MB 对于非小型表是免费的,因为在“范围”中为将来的操作保留空间。为什么要进行碎片整理?
(查看
TABLE STATUS
提供)它显示了 0.9GB 的“数据”,但显示了巨大的 6.9GB 的“免费”。(我假设这
STATUS
是在?)这可能存在OPTIMIZE
于多种情况下:innodb_file_per_table = OFF
,在这种情况下,“空闲”是 中有多少可用空间ibdata1
,与所讨论的表无关。(你说这不是你的情况。)PARTITIONs
。每个分区总是显示一些“空闲”空间;它最多可以加起来 6.9GB。PARTITIONing
(追求可能不明智的一个原因。)DELETEd
大部分表的行。这可能是一个非常缓慢的过程。创建一个新表,复制要保留的行,然后重命名以将表放置到位会更快。而且,你猜怎么着,这种方法会让你免费“优化”。MariaDB中的碎片整理功能,根据手册:
所以...