我们有一个数据库,一个非常简单的模式:建议数据库设计 - 密集的插入和删除大量的记录
CREATE TABLE IF NOT EXISTS tblIndex(
frame_type INT,
pts VARCHAR(5),
ts_start INT primary key,
ts_end INT)
和应用场景是:
每第二个用户将插入2〜50条记录,这些记录的
ts_start
字段不断增加。 8小时后,最多有1_800_000条记录。通过将同步模式设置为关,迄今为止性能似乎不错。因为每条记录的数据只有16个字节,所以即使插入速度不太快,我们也可以使用一些缓冲区。8小时后,用户会告诉我告诉上限ts_start删除最早的数据,所以我会做
DELETE FROM tblIndex WHERE ts_start < upper_bound_ts_start.
删除90_000(这是半小时的记录) 1_800_000现在需要17秒。垃圾位比预期的要长。任何方式来减少这种情况?我们不在乎记录是否立即同步到硬盘。我们正在考虑启动一个单独的线程来执行删除操作,以使此调用成为异步。我不确定的是(长时间)删除是否会影响插入性能,如果他们共享相同的连接?或者我应该使用分离的连接进行插入和删除?但是通过这种方式,他们是否需要在应用程序级别同步?
搜索。
SELECT ts_start FROM tblIndex WHERE ts_start BETWEEN ? AND ?
- 由于ts_start是主键,因此现在我们的需求可以确保性能。我想我应该使用分离的连接进行搜索,对吧?
配置的SQLite:
hard disk database (usb interface)
cache size is 2000
page size is 1024
sync mode is 0 (off)
journal_mode mode is truncate
感谢您的任何建议,以提高删除性能或对整体设计。
编辑:350M MIPS CPU,没有太多内存(< 2M)特定于此应用程序。
谢谢,洛特。这是一个很好的建议,“以时间序列号命名每个文件”,我们会考虑这个选择。我们选择数据库的原因是我们想要处理所有搜索,同步和电源故障安全的东西到数据库。而且我们在嵌入式系统上,所以我们没有足够的内存来加载所有这些索引文件(到内存中)。 – pierrotlefou 2009-08-21 01:54:52
您只有4列,其中三个是整数。您可以编写比SQL更快的自己的搜索。同步文件比数据库更简单,更快速,更可靠。 powerfail-fail-safe已经是OS文件系统的一部分。 RDBMS仅适用于具有(a)灵活性,(b)连接和(c)持久性的复杂数据模型。你没有这些属性。 – 2009-08-21 10:31:20
我有几乎相同的需求和平面文件是绝对不是正确的解决方案,除非您可以编码我搜索和组查询效率与SGBD一样... – Mose 2010-01-22 10:28:37