1

我有一个看起来像这样用 sqlite 创建的表。

CREATE TABLE Cars ( 

POWER DOUBLE ,
CAPACITY DOUBLE,
SPEED DOUBLE,   
TIME INTEGER  NOT NULL,
TYPE INTEGER  NOT NULL, 
MODEL INTEGER  NOT NULL,

PRIMARY KEY ( TIME, TYPE, MODEL ));

TYPE有15个不同的值,每个类型有20个不同的MODEL值。对于每个模型,每 10 秒插入一个新记录。

一个小例子:

POWER----TIME----TYPE----MODEL
45.6     2588     3       14
46.8     2588     3       15
44.7     2588     3       16

这张表真的很大,有数百万行。

如您所见,我的主键是(TIME, TYPE, MODEL)因为那是一个唯一标识符。

我的应用程序多次运行选择查询,当时间范围很大时,或者我为多个模型运行查询时,这可能需要很长时间。

例如,我经常运行这种类型的查询:

SELECT power, time, type, model 
FROM CARS 
WHERE type = 3 AND model = 14 AND time BETWEEN 2588 and 13550;

我尝试过使用主键,例如(TYPE, MODEL, TIME)在某些情况下提高了性能,但不是在很长的时间间隔内。

我的问题是如何优化这种记录检索,以及哪种主键似乎最适合这种情况?

插入和更新在性能方面不是问题。

4

2 回答 2

1

主键中字段的顺序应该反映每个字段的选择性(最选择性优先)。

从表面上看,时间应该是第一位的,因为在特定时间选择会比特定类型或模型返回更少的记录。

但是,如果您的大部分或所有查询都将选择一个时间范围,那么最好将时间放在主键的末尾,因为范围选择的选择性不如特定值。

我建议将主键更改为 (model, type, time) - 按此顺序。

于 2012-08-16T12:10:11.520 回答
1

MSDN 上提供的关于复合键的一般指导是将具有最高基数(即最唯一值)的列放在键/索引的根部。

所以在你的情况下,关键应该是你所拥有的 - 即:

CREATE TABLE Cars ( 
  PRIMARY KEY ( TIME, TYPE, MODEL ),
  POWER DOUBLE ,
  CAPACITY DOUBLE,
  SPEED DOUBLE,   
  TIME INTEGER NOT NULL,
  TYPE INTEGER NOT NULL, 
  MODEL INTEGER NOT NULL
);

适用于您知道 TIME 值的查询。

于 2012-08-16T12:11:47.273 回答