SQlite,Android,真实故事。我有一张表,用作缓存:
CREATE TABLE cache(key TEXT, ts TIMESTAMP, size INTEGER, data BLOB);
CREATE UNIQUE INDEX by_key ON cache(key);
CREATE INDEX by_ts ON cache(ts);
Run Code Online (Sandbox Code Playgroud)
在应用程序生命周期中,我填充了缓存,在某些时候我想清除它并删除N
记录。通常,该表将包含 ~25000 个 blob,每个 blob 约为 100-500Kb,数据库中的 blob 总大小为 600-800Mb,但现在我测试了 ~2000,大约为 60Mb(以下数字适用于这种情况)。清除会删除 90% 的缓存条目。
我尝试了不同的方法来做到这一点,这里简要说明:
[1]最差也最简单。先选择,再一一移除,行走光标。慢得可怕。
[2] 使用SQLite 来做查询(删除其中包含完全N
字节的blob ):
DELETE FROM blobs WHERE
ROWID IN (SELECT ROWID FROM blobs WHERE
(SELECT SUM(size) FROM blobs AS _ WHERE ts <= blobs.ts) <= N);
Run Code Online (Sandbox Code Playgroud)
这更快,但仍然非常慢:~15 秒。似乎它也具有二次复杂性。
[3]选择删除位置周围的行(使用平均 blob 大小进行计算)并使用简单WHERE
子句删除:
-- …
Run Code Online (Sandbox Code Playgroud)