2013-03-18 65 views
0

我有一个数据库中引用的缓存文件列表,并希望清除最大的大小超过20,000,000的大小限制。MySQL - 当总和小于x时选择

表简单地看起来是这样的:

[ hash | filesize | timestamp ] 

在刚运行以下命令的那一刻,

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

然后处理结果外。是否有任何方法可以获得超过20,000,000限制的结果列表?

回答

0

我会用桌子上一个binary searchSUM功能看,当它超过阈值大小,说SIZE(2000万在你的情况)

  1. 找出的50%,最新行大小表。
  2. 如果它小于SIZE,查询前75%的行,如果它大于SIZE,则查询前25%的行。
  3. 重复将行设置为每次两个。

这样您就可以在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; 
+0

哎欢呼藏汉,如上 – 2013-03-18 08:32:27

+0

指出@DominicEngland见更新的回答同样的问题 – DhruvPathak 2013-03-18 08:42:47

1

我会使用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(文件大小)<20 000 000? – 2013-03-18 08:44:17