针对2种不同的搜索优化SQLite表

时间:2013-11-10 20:35:12

标签: sql sqlite

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

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

此表的主要用途是SELECT个子集,state - year对或与randInt进行比较。 randInt是一个随机整数,范围从0到100.

州 - 年选择的例子:

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 INDEX randIntstate,year的复合索引,但我不知道是否有一个干扰另一个,我不知道知道如何创建复合指数。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

CREATE INDEX indyearstate ON tbl (year,state)

答案 1 :(得分: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);

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

相关问题