SELECT查询良好性能的主要关键选择

时间:2012-08-16 12:01:30

标签: sql sqlite database-design

我有一个用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)这样的主键进行实验,这些主键在某些情况下提高了性能,但在很长的时间间隔内没有。

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

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

2 个答案:

答案 0 :(得分:1)

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

从表面上看,时间应该首先出现,因为在特定时间选择会比特定类型或模型返回更少的记录。

但是,如果您的大多数或所有查询都要选择范围次,那么最好将时间放在主要的 end 因为范围选择的选择性低于特定值。

我建议将主键更改为(型号,类型,时间) - 按此顺序。

答案 1 :(得分: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值的查询中表现良好。