加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

限制Sqlite DB中的记录数

发布时间:2020-12-12 18:58:10 所属栏目:百科 来源:网络整理
导读:我在这里尝试实现的是一个条件,其中sqlite数据库只保存最近的1000条记录.我有每条记录的时间戳. 立即攻击的低效逻辑之一是检查记录总数.如果它们超过1000,那么只需删除掉外围的那些. 但是,我必须对每个INSERT执行此检查,这会使事情变得非常低效. What could
我在这里尝试实现的是一个条件,其中sqlite数据库只保存最近的1000条记录.我有每条记录的时间戳.
立即攻击的低效逻辑之一是检查记录总数.如果它们超过1000,那么只需删除掉外围的那些.

但是,我必须对每个INSERT执行此检查,这会使事情变得非常低效.

What could be a better logic? Can we do something with triggers?

根据我想到的相同逻辑的一些相关问题发布在SO上: –

Delete oldest records from database

SQL Query to delete records older than two years

解决方法

您可以使用隐式 “rowid”列.

假设您不以不同方式手动删除行:

DELETE FROM yourtable WHERE rowid < (last_row_id - 1000)

您可以使用API function或max(rowid)获取最后一个rowid

如果您不需要准确地记录1000条记录(例如只想清理旧记录),则不必在每个插入上执行此操作.在程序中添加一些计数器并执行清理f.i.每100次插入一次.

更新:

无论如何,您需要在每个插入或每个选择上支付性能.所以选择取决于你有更多:INSERTs或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(或创建适当的视图).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读