2009-08-06 112 views
3

我有一个sqlite数据库用于存储有关备份作业的信息。每次运行,由于将大约32,000个条目添加到特定的表中,它增加了约25mb。主键对SQLite性能的影响

此表是一个“映射表”,用于将某些信息链接到另一个表中的记录......并且它有一个我不使用的主键(autoincrement int)。

sqlite将根据其值保留INT列的1,2,4或8个字节。该表只有3个额外的列,也是INT类型。

我在我的查询中用作过滤器(WHERE)的列上向数据库添加了索引。

在存在索引等情况以及所描述的情况下,主键在性能方面是否有用?

注意:性能对于此项目非常重要 - 但如果在32,000入门级别上保存10ms意味着额外需要10MB数据,则不会这么做!

回答

2

主键索引用于查找给定主键的行。它也用于确保主键值是唯一的。

如果您使用其他列搜索数据,则不会使用主键索引,因此不会产生性能优势。不过,它的存在也不应该对性能产生负面影响。

一个不必要的索引会浪费磁盘空间,并使INSERT和UPDATE语句执行速度变慢。它不应该对查询性能产生负面影响。

+0

我主要赞同这一点。重要的想法是将数据库保存在内存中,如果索引太大,那么它可能很重要。 – Unknown 2009-08-06 07:32:39

+0

@未知:对于一个普通的磁盘备份的内存缓存数据库,未使用的索引不应该进入内存,如果他们这样做,很快就会被驱逐。但是,是的,如果你正在构建一个完整的内存数据库而没有后备磁盘存储,这些索引可能会伤害你。 – Thilo 2009-08-06 07:41:05

0

如果你真的不使用这个ID什么不放这个列+主键?保持未使用的主键id列存活的唯一原因是为了能够与另一个表创建主从关系。

另一种可能性是保留列但删除主键。这意味着应用程序必须注意为每个插入语句提供一个唯一的ID。在每批操作之前和之后,您必须检查此列是否仍然是唯一的。由于多个并发问题,这在例如MySQL和Oracle中不起作用,但它在sqlite中起作用。