我有一个数据库中引用的缓存文件列表,并且想要清除大小限制为 20,000,000 之外的最旧文件。
表简单地看起来像这样:
[ hash | filesize | timestamp ]
目前只需运行以下命令,
SELECT `hash`, `filesize` FROM `cachetable` ORDER BY `timestamp` DESC;
然后在外部处理结果。有什么方法可以获取超出 20,000,000 个限制的结果列表?
我有一个数据库中引用的缓存文件列表,并且想要清除大小限制为 20,000,000 之外的最旧文件。
表简单地看起来像这样:
[ hash | filesize | timestamp ]
目前只需运行以下命令,
SELECT `hash`, `filesize` FROM `cachetable` ORDER BY `timestamp` DESC;
然后在外部处理结果。有什么方法可以获取超出 20,000,000 个限制的结果列表?
我会使用偏移量
SELECT `hash`, `filesize`
FROM `cachetable`
ORDER BY `timestamp` DESC
LIMIT <your_limit_here>
OFFSET 20000000;
请务必将 your_limit_here 替换为您自己可接受的数字。
我会在表上使用二进制搜索SUM
,并查看它何时超过阈值大小,例如 SIZE(在您的情况下为 20000000)
这样,您将能够在 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;