2009-08-20 55 views
1

我们有一个数据库,一个非常简单的模式:建议数据库设计 - 密集的插入和删除大量的记录

CREATE TABLE IF NOT EXISTS tblIndex(
    frame_type INT, 
    pts VARCHAR(5), 
    ts_start INT primary key, 
    ts_end INT) 

和应用场景是:

  1. 每第二个用户将插入2〜50条记录,这些记录的ts_start字段不断增加。 8小时后,最多有1_800_000条记录。通过将同步模式设置为关,迄今为止性能似乎不错。因为每条记录的数据只有16个字节,所以即使插入速度不太快,我们也可以使用一些缓冲区。

  2. 8小时后,用户会告诉我告诉上限ts_start删除最早的数据,所以我会做

    DELETE FROM tblIndex WHERE ts_start < upper_bound_ts_start.

    删除90_000(这是半小时的记录) 1_800_000现在需要17秒。垃圾位比预期的要长。任何方式来减少这种情况?我们不在乎记录是否立即同步到硬盘。我们正在考虑启动一个单独的线程来执行删除操作,以使此调用成为异步。我不确定的是(长时间)删除是否会影响插入性能,如果他们共享相同的连接?或者我应该使用分离的连接进行插入和删除?但是通过这种方式,他们是否需要在应用程序级别同步?

  3. 搜索。 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)特定于此应用程序。

回答

2

由于数据是短暂的 - 很小 - 为什么你要使用数据库?

你会对一个简单的平面文件目录感到高兴。

您的网页查询可以简单地读取相关的一组文件并返回所需的结果。 1_800_000个16字节的记录仅仅是28Mb的文件数据。你可以将整件事物读入记忆中,在记忆中进行处理,并呈现结果。

一个单独的进程可以删除在午夜一天一次的旧文件。

第三个进程可以每秒向工作文件追加2-50个16字节的记录。

  • 写入和刷新以便文件在每个I/O之后是正确和完整的。如果您的读者正常处理不完整的最后一条记录,则甚至不需要锁定。

  • 用基于时间的序列号命名每个文件。例如,您可以将系统时间(以秒为单位)除以4 * 60 * 60并截断答案。这是一个序列号,每4小时进行一次,创建一个新文件。 8小时数据的是这些文件的3(2之前的4小时的文件,再加上当前的工作文件。)

+0

谢谢,洛特。这是一个很好的建议,“以时间序列号命名每个文件”,我们会考虑这个选择。我们选择数据库的原因是我们想要处理所有搜索,同步和电源故障安全的东西到数据库。而且我们在嵌入式系统上,所以我们没有足够的内存来加载所有这些索引文件(到内存中)。 – pierrotlefou 2009-08-21 01:54:52

+1

您只有4列,其中三个是整数。您可以编写比SQL更快的自己的搜索。同步文件比数据库更简单,更快速,更可靠。 powerfail-fail-safe已经是OS文件系统的一部分。 RDBMS仅适用于具有(a)灵活性,(b)连接和(c)持久性的复杂数据模型。你没有这些属性。 – 2009-08-21 10:31:20

+0

我有几乎相同的需求和平面文件是绝对不是正确的解决方案,除非您可以编码我搜索和组查询效率与SGBD一样... – Mose 2010-01-22 10:28:37

0

怎么样有一个SQLite数据库每半小时?换句话说,每半小时启动一个新的数据库文件,并删除旧的数据库文件。

+0

你如何在所有桌子上进行搜索或分组? 我不认为'联盟'会给出好的表现...... – Mose 2010-01-22 10:30:18

+0

上面的一条评论提到使用Map-Reduce。 如果目标是报告,那么我会定期将各个数据库移动到某种数据仓库中。如果你实时需要这个,那么sqllite可能不是数据库的正确选择。 – Dave 2010-01-25 16:48:13