现在一个名为 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 无法处理原始查询的原因。
编辑2
我应该改变我的问题。有没有办法加快sqlite中的这种查询?