我有一个基本的反向查找表,其中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不是唯一的......
答案 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;