2013-03-18 63 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