我在这里尝试实现的是一个条件,其中sqlite数据库只保存最近的1000条记录.我有每条记录的时间戳.
立即攻击的低效逻辑之一是检查记录总数.如果它们超过1000,那么只需删除掉外围的那些.
立即攻击的低效逻辑之一是检查记录总数.如果它们超过1000,那么只需删除掉外围的那些.
但是,我必须对每个INSERT执行此检查,这会使事情变得非常低效.
What could be a better logic? Can we do something with triggers?
根据我想到的相同逻辑的一些相关问题发布在SO上: –
解决方法
您可以使用隐式
“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(或创建适当的视图).