我要在此处实现的条件是,sqlite数据库仅保存最近的1000条记录。每个记录都有时间戳记。立即生效的低效逻辑之一就是检查记录总数。如果它们超过1000,则只需删除掉到外围的那些。
但是,我将必须对每个INSERT进行此检查,这会使事情效率很低。
您可以为此使用一个隐式的“ rowid”列。
假设您没有以其他方式手动删除行:
DELETE FROM yourtable WHERE rowid < (last_row_id - 1000)
您可以使用API函数或max(rowid)
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触发器,因此当您批量插入许多记录时,值得暂时禁用触发器。
FOR EACH ROW
如果INSERT太多,那么在数据库方面您将无能为力。您可以通过添加触发条件(例如)来实现不那么频繁的触发调用AFTER INSERT WHEN NEW.rowid % 100 = 0。选择仅使用LIMIT 1000(或创建适当的视图)。
AFTER INSERT WHEN NEW.rowid % 100 = 0
我无法预料会有多快。最好的方法是仅衡量您在特定情况下将获得的性能。