2016-04-29 19 views
1

我有一个基本的反向查找表,其中ID是数字升序已经排序:查找已经按排序顺序排列的大型静态表(sqlite),最有效的策略是什么?

id INT NOT NULL, 
value INT NOT NULL 

ID被不是唯一;每个ID都有5到25,000个关联值。每个ID是独立的,即,ID之间没有关系。

该表格是静态的。只读,没有插入或更新。该表有100-200万条记录。数据库本身将在7-12GB左右。 SQLite的。

我会在此表中进行频繁查找,并希望每个查询的响应时间最快。查找只有一个方向的,无序的,并始终形式:

SELECT value WHERE id IN (x,y,z) 

什么优势的排序预购给我的数据库效率方面?与典型的无序表格相比,我应该做什么不同?我如何告诉sql它是一个有序列表?

index是什么意思:在id上创建索引是否有必要,甚至有帮助?

[更新感谢戈登Linoff聚集评论]。据我所知,sqlite不直接支持聚集索引。 wiki说:“是否支持[聚簇索引]?不,但如果使用INTEGER PRIMARY KEY,它将充当聚簇索引。”在我的情况下,列ID不是唯一的...

回答

0

假设空间不是问题,您应该在(id, value)上创建索引。这应该足以满足您的需求。

但是,如果表是静态的,那么我建议您在创建表时创建一个集群索引。索引将具有相同的密钥,(id, value)

+0

我找不到太多关于SQLite和聚集索引。我所看到的只是在sqlite维基上提到的(https://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning):“是否支持[聚簇索引]?不,但如果使用INTEGER PRIMARY KEY,它会充当一个聚集索引。“ – LunaiThi

+0

@LunaiThi。 。 。哎呀,我错过了。那么,一个普通的指数应该没问题。 –

0

如果表恰好被排序,数据库不知道这个,所以你仍然需要一个索引。

这是一个更好的主意,用一个WITHOUT ROWID table(什么其他的DB调用一个聚集索引):

CREATE TABLE MyLittleLookupTable (
    id INTEGER, 
    value INTEGER, 
    PRIMARY KEY (id, value) 
) WITHOUT ROWID; 
+0

来自sqlite.org:“WITHOUT ROWID表将正确工作(也就是说,它们提供了正确的答案),只有一个INTEGER PRIMARY KEY表,但普通的rowid表在这种情况下运行得更快,因此,它是良好的设计,以避免创建WITHOUT ROWID表与单列PRIMARY KEY类型INTEGER“...所以,是一个复合KEY(ID,值)比单列KEY(ID)更好?它只是在1个表(索引)中进行1次查找,而不是2次查找。如果组合键更好,WITHOUT ROWID的组合效果会更好吗?在测试中,它与我的数据没有多大区别。 – LunaiThi

+0

您的表没有单列主键(因为'id'不是唯一的),因此询问它是否会更好是没有意义的。单独的索引需要更多的存储空间。 –