相关疑难解决方法(0)

SQLite:删除大量行的有效方法

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)

sql sqlite android

5
推荐指数
1
解决办法
7483
查看次数

标签 统计

android ×1

sql ×1

sqlite ×1