一尘不染

限制Sqlite DB中的记录数

sql

我要在此处实现的条件是,sqlite数据库仅保存最近的1000条记录。每个记录都有时间戳记。立即生效的低效逻辑之一就是检查记录总数。如果它们超过1000,则只需删除掉到外围的那些。

但是,我将必须对每个INSERT进行此检查,这会使事情效率很低。


阅读 222

收藏
2021-03-10

共1个答案

一尘不染

您可以为此使用一个隐式的“ rowid”列。

假设您没有以其他方式手动删除行:

DELETE FROM yourtable WHERE rowid < (last_row_id - 1000)

您可以使用API函数max(rowid)

如果您不需要 正好有
1000条记录(例如,只想清理旧记录),则不必在每个插入记录上都进行记录。在程序中添加一些计数器,并每100次插入执行一次清理fi。

更新:

无论如何,您要为每个插页或每个选择支付性能。因此,选择取决于您所拥有的更多内容:INSERT或SELECTs。

如果没有太多插入要关心性能,则可以使用以下触发器保留不超过1000条记录:

CREATE TRIGGER triggername AFTER INSERT ON tablename BEGIN
     DELETE FROM tablename WHERE timestamp < (SELECT MIN(timestamp) FROM tablename ORDER BY timestamp DESC LIMIT 1000);
END

在timestamp列上创建唯一索引也是一个好主意(以防尚未创建PK)。还要注意,SQLITE仅支持FOR EACH ROW触发器,因此当您批量插入许多记录时,值得暂时禁用触发器。

如果INSERT太多,那么在数据库方面您将无能为力。您可以通过添加触发条件(例如)来实现不那么频繁的触发调用AFTER INSERT WHEN NEW.rowid % 100 = 0。选择仅使用LIMIT 1000(或创建适当的视图)。

我无法预料会有多快。最好的方法是仅衡量您在特定情况下将获得的性能。

2021-03-10