MySQL - 当总和小于x时选择
问题描述:
我有一个数据库中引用的缓存文件列表,并希望清除最大的大小超过20,000,000的大小限制。MySQL - 当总和小于x时选择
表简单地看起来是这样的:
[ hash | filesize | timestamp ]
在刚运行以下命令的那一刻,
SELECT `hash`, `filesize` FROM `cachetable` ORDER BY `timestamp` DESC;
然后处理结果外。是否有任何方法可以获得超过20,000,000限制的结果列表?
答
我会用桌子上一个binary search和SUM
功能看,当它超过阈值大小,说SIZE(2000万在你的情况)
- 找出的50%,最新行大小表。
- 如果它小于SIZE,查询前75%的行,如果它大于SIZE,则查询前25%的行。
- 重复将行设置为每次两个。
这样您就可以在log(N)查询中获得目标阈值,其中N是表中的总行数。 获得目标阈值后说阈值,之后删除所有行:
SELECT `hash`, `filesize`
FROM `cachetable`
ORDER BY `timestamp` DESC
LIMIT NUMBER_ROWS_TO_DELETE /* any large number to delete all after THRESHOLD */
OFFSET THRESHOLD;
答
我会使用OFFSET
SELECT `hash`, `filesize`
FROM `cachetable`
ORDER BY `timestamp` DESC
LIMIT <your_limit_here>
OFFSET 20000000;
一定要与自己接受的更换次数your_limit_here。
+0
嗨欢呼声,问题是,虽然每个文件的大小不同,我不想让20,000,000个文件,但总不是怎么过的许多文件那大小 – 2013-03-18 08:32:05
+0
所以你只想保留X文件WHERE SUM(文件大小) 2013-03-18 08:44:17
哎欢呼藏汉,如上 – 2013-03-18 08:32:27
指出@DominicEngland见更新的回答同样的问题 – DhruvPathak 2013-03-18 08:42:47