0

我有一个数据库中引用的缓存文件列表,并且想要清除大小限制为 20,000,000 之外的最旧文件。

表简单地看起来像这样:

[ hash | filesize | timestamp ]

目前只需运行以下命令,

SELECT `hash`, `filesize` FROM `cachetable` ORDER BY `timestamp` DESC;

然后在外部处理结果。有什么方法可以获取超出 20,000,000 个限制的结果列表?

4

2 回答 2

1

我会使用偏移量

SELECT `hash`, `filesize` 
FROM `cachetable` 
ORDER BY `timestamp` DESC 
LIMIT <your_limit_here> 
OFFSET 20000000;

请务必将 your_limit_here 替换为您自己可接受的数字。

于 2013-03-18T08:29:07.083 回答
0

我会在表上使用二进制搜索SUM,并查看它何时超过阈值大小,例如 SIZE(在您的情况下为 20000000)

  1. 找出表中 50% 最新行的大小。
  2. 如果小于 SIZE,则查询前 75% 的行,如果大于 SIZE,则查询前 25% 的行。
  3. 通过每次将行集分成两部分来重复。

这样,您将能够在 log(N) 查询中获得目标阈值,其中 N 是表中的总行数。获得目标阈值后说 THRESHOLD,删除之后的所有行:

SELECT `hash`, `filesize` 
FROM `cachetable` 
ORDER BY `timestamp` DESC 
LIMIT  NUMBER_ROWS_TO_DELETE /* any large number to delete all after THRESHOLD */ 
OFFSET THRESHOLD;
于 2013-03-18T08:28:19.253 回答