【发布时间】:2019-07-21 08:19:10
【问题描述】:
我有一个表 (innodb),每周有 100 万个新插入 (20GB)。我只需要 1 周的数据,所以我在 7 天后删除了它,所以每天我们删除大约 3GB 并插入 3GB 新数据。该表已经与其他表位于不同的数据库中。
问题是磁盘空间只有在优化查询之后才会被释放,所以我们每隔几周在晚上运行一次。它可以工作,但它需要 30 分钟,并在那时冻结整个数据库服务器,而不仅仅是特定数据库。
有什么方法可以更快优化?
如果我们每次删除数据都运行一次优化,会比每隔几周运行一次优化更快吗?我认为当只需要从磁盘中删除 3GB 的已删除行时运行它可能会更快,如果我们在 20 天后运行它,它是 60GB。是对的吗?还有另一种方法来优化优化吗?
【问题讨论】:
-
你的 MySQL 版本是多少?你有足够的可用硬盘空间吗?
Optimize不应该冻结你的整个数据库。此外,虽然在删除时不释放,但它会重用空间。因此,如果您每天删除,它应该保持在大约 8 天的大小,它不会下降到 7 天的大小,白天会增长到 8 天的大小,删除时会回落到 7 天的大小. (如果您每周删除,它应该保持在大约 14 到 15 天的大小)。你测试过/那会是个问题吗? -
你确定优化真的有必要吗? IIRC 然后 InnoDB 将空间标记为在删除后可重用,因此新添加的行将插入该空间。所以运行优化器的唯一结果是被 InnoDB 标记为空闲的区域也会在系统本身上释放。如果您不运行该优化脚本,您是否检查过您的数据库使用量是否真的在增长,比如说一个星期。
-
MySQL 版本为 5.0.11。有足够的磁盘空间,但需要定期运行优化,因为 InnoDB 在某种程度上不会重用它在删除后没有释放的磁盘空间。数据库的大小不断增长。刚刚尝试再次运行它,花了55分钟。表/数据库(我们将该表移动到单独的数据库)大小为 20GB // 400k 行。更新mysql有帮助吗?还有其他想法吗?
-
表里到底是什么?听起来平均行是 20KB;这是异常大的,必须涉及“非记录”存储。 可能有更好的方法来处理所涉及的
TEXT/BLOB(s)。
标签: mysql database innodb database-optimization