【问题标题】:MySql reclaim blob space with InnoDBMySql 使用 InnoDB 回收 blob 空间
【发布时间】:2012-04-30 14:57:34
【问题描述】:

我需要构建一个表,其中包含一个占行大小的 98% 的大型 BLOB。但是,此 BLOB 只会暂时保留在行中,并将移动到另一个位置,然后 BLOB 列将设置为 NULL。 MySQL 可以重用这个空间还是它总是行的一部分?如果它不能自动重用,是否有另一种方法(比如优化表)可以用来手动回收这个空间?如果没有,我可能需要找到另一种解决方案来处理这组特定的数据。

【问题讨论】:

  • 你可以将它存储在 MySQL 之外,比如 Redis 或其他键/值存储吗?
  • 数据将通过批处理异步过程转移到其他存储(S3)。出于事务目的,初始写入必须是 mysql。我可以在事务期间将它移动到另一个存储,例如 Redis(或持久消息队列),但是这个过程必须是一个快速路径,所以我犹豫要添加其他移动部分。这就是为什么我专注于将 BLOB 移至 S3 后是否/如何回收空间。如果绝对没有办法回收,那么 Redis 可能是下一个选择,因为它是我们架构的一部分。

标签: mysql innodb


【解决方案1】:

听起来你肯定会更好地使用 Redis,甚至只是将你的 blob 存储在文件系统上。这实际上是我推荐的;将数据保存在文件中并将文件名放在表中。异步上传到 s3 完成后,将其设置为 null。如果您使用为处理大型对象而优化的文件系统,这总是比插入数据库更快。

blob 的存储方式不仅取决于数据的长度,还取决于您实际使用的 mysql 版本。删除的行总是可以重用,当后续插入不重用空间时,可以使用优化表恢复。但是优化表会锁定该表。所以你第二次减慢系统速度。

【讨论】:

  • 我实际上喜欢将 blob 保存到我们的 SAN 的想法。为了保持我们的速度一致,我们将进程分成两个线程 - 一个保存 mysql 数据,另一个将 blob 保存到文件系统(实际上是 SAN)。由于它们是并行运行的,因此它与将所有内容完全保存到 mysql 一样快。然后我们有一个真空过程,将文件移动到 S3 并将新位置标记到 mysql 审计记录。即使在我们预期的负载下进行了测试,似乎也能像魅力一样工作。
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
相关资源
最近更新 更多