0

I have a SQLite table that's about 30 million rows by 500 columns. Three of those columns are:

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

My primary use for this table is to SELECT subsets, either by state-year pairs or by comparison with randInt. randInt is a random integer that ranges from 0 to 100.

Examples of state-year selection:

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

Examples of randInt selection:

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

These two types of selections comprise more than 95% of the database queries I will be doing. Is there any way to optimize the table specifically for them?

I guess I want to explicitly CREATE INDEX for randInt and a compound index for state,year, but I don't know if having one interferes with the other, and I don't know how to create compound indices.

Should I turn off indexing on all the other 497 columns, since I will rarely if ever index over them?

4

2 に答える 2

1

2 つのインデックスを作成する必要があります。

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 に答える
1

1 つの列のインデックスを作成しても、他のインデックスには影響しません。ただし、SQLite はクエリ中に最大 1 つのインデックスを使用することに注意してください (あなたの場合は問題ではありません)。

また、他の 497 列のインデックスを作成していない場合は、「インデックスをオフにする」必要はありません。インデックスはスペースを取り、テーブルが更新されると更新に時間がかかるため、不要なインデックスが 497 個あると大変なことになります。

2 つの列にインデックスを作成するには、次のように実行する必要があります。

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