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. 行セットを毎回2つに分割して繰り返します。

このようにして、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 に答える