現在、log というテーブルには約 200 万件のレコードがあります。クエリのパフォーマンスは許容できなくなりますが、現在の段階でテーブルを別のパーティションに分割したくありません。したがって、クエリのパフォーマンスを向上させるために、いくつかのインデックスを追加しようとしています。
CREATE TABLE log
(
id Integer primary key autoincrement,
app_id text,
__key__id INTEGER,
secret text,
trace_code text,
url text,
action text,
facebook_id text,
ip text,
tw_time timestamp,
time timestamp,
tag text,
to_url text,
from_url text,
referer text,
weight integer,
Unique(app_id, __key__id)
);
CREATE INDEX key1 on log (action, url, tag);
ただし、sqlite はインデックスを無視してテーブル全体をスキャンしているようです。何か見逃しましたか?
sqlite> explain query plan select count(*) from log where action like 'content_%
';
0|0|0|SCAN TABLE log (~1182357 rows)
sqlite> explain query plan select count(*) from log where action like 'content_%
' group by url, tag;
0|0|0|SCAN TABLE log (~1182357 rows)
0|0|0|USE TEMP B-TREE FOR GROUP BY
編集1
@MaxSemありがとう、クエリを次のように変更すると、はるかに良くなることがわかりました。
sqlite> explain query plan select count(*) from log indexed by key1 where action
in ('content_click','content_mouseover', 'content_display');
0|0|0|SEARCH TABLE log USING COVERING INDEX key1 (action=?) (~886770 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
ただし、Sqlite が元のクエリを処理できない理由は説明できません。
EDIT2
質問を変更する必要があります。sqlite でこの種のクエリを高速化する方法はありますか?