在已经按排序顺序(sqlite)的大型静态表上查找的最有效策略是什么?

时间:2016-04-29 02:37:03

标签: sql sqlite sorting indexing

我有一个基本的反向查找表,其中id 已按数字升序排序

id INT NOT NULL,
value INT NOT NULL

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

该表是静态的。只读,无需插入或更新。该表有1亿至2亿条记录。数据库本身大约为7-12gb。源码。

我将在此表中进行频繁查找,并希望每个查询的响应时间最快。查找只是单向的,无序的,并且始终具有以下形式:

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

预先排序的订单在数据库效率方面有什么优势?与典型的无序表格相比,我应该做些什么?我怎么告诉sql它是一个有序列表?

索引怎么样?在id上创建索引是否必要或甚至有用?

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

2 个答案:

答案 0 :(得分:0)

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

但是,如果表是静态的,那么我建议您在创建表时创建 clustered 索引。索引具有相同的键(id, value)

答案 1 :(得分:0)

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

最好使用WITHOUT ROWID table(其他数据库称为聚簇索引):

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