0

我有一个大约 3000 万行乘 500 列的 SQLite 表。其中三列是:

CREATE TABLE core (
state TEXT,
year INTEGER,
randInt INTEGER,
);

我对这个表的主要用途是子集,SELECT要么成对,要么与. 是一个随机整数,范围从 0 到 100。stateyearrandIntrandInt

州年选择示例:

SELECT * WHERE state='MA' AND year=1999;
SELECT * WHERE (state='MA' AND year=1999) OR (state='NJ' AND year=1998);

randInt 选择示例:

SELECT * WHERE randInt < 10;
SELECT * WHERE randInt = 10;

这两种类型的选择构成了我将要执行的 95% 以上的数据库查询。有没有办法专门为他们优化表格?

我想我想明确地CREATE INDEXrandInt和一个复合索引state,year,但我不知道有一个是否会干扰另一个,而且我不知道如何创建复合索引。

我是否应该关闭所有其他 497 列的索引,因为我很少会索引它们?

4

2 回答 2

1

为一列创建索引对其他索引没有影响。但是请注意,SQLite 在查询期间最多使用一个索引(在您的情况下不是问题)。

此外,如果您没有为其他 497 列创建索引,那么您不需要为它们“关闭索引”。当表更新时,索引会占用空间并且需要时间来更新,因此拥有不需要的 497 个索引将是一场灾难。

要在两列上创建索引,您需要执行以下操作:

CREATE INDEX indyearstate ON tbl (year,state)
于 2013-11-10T20:46:19.790 回答
1

您应该创建两个索引:

CREATE INDEX IX_1 ON core(year, state);
CREATE INDEX IX_2 ON core(randInt);
ANALYZE; -- ask SQLite to analyze data and update "stats" table on indices

从那时起,您的查询将(显着)更快地运行,并且您不应该做任何事情来更新索引:SQLite 将使它们保持最新(直到您通过“DROP INDEX”手动删除索引)。

你也可以试试这个索引而不是 IX_1:

CREATE INDEX IX_1a ON core(state, year);

如果您的核心表有更多不同的“状态”,那么“年”这个索引可以加快速度。

于 2013-11-11T09:47:52.853 回答