我有一个用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)
这样的主键进行实验,这些主键在某些情况下提高了性能,但在很长的时间间隔内没有。
我的问题是如何优化这种记录检索,以及哪种主键似乎最适合这种情况?
插入和更新在性能方面不是问题。
答案 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值的查询中表现良好。