【发布时间】:2012-03-02 12:12:17
【问题描述】:
我正在搜索的列上使用索引。索引是这样创建的:
CREATE INDEX index1 on <TABLE>(<col1> COLLATE NOCASE ASC)
CREATE INDEX index2 on <TABLE>(<col2> COLLATE NOCASE ASC)
CREATE INDEX index3 on <TABLE>(<col3> COLLATE NOCASE ASC)
现在,搜索记录的选择查询是这样的:
select <col1> from <TABLE> where <col1> like '%monit%' AND <col2> like '%84%' GROUP BY <col1> limit 0,501;
当我像这样在我的 sqlite 数据库上运行 EXPLAIN QUERY PLAN 时:
EXPLAIN QUERY PLAN select <col1> from <TABLE> where <col1> like '%monit%' AND <col2> like '%84%' GROUP BY <col1> limit 0,501;
它返回输出为:
0|0|0|使用索引扫描表(~250000 行)
当我删除索引时,这个 EXPLAIN QUERY PLAN 产生的输出是:
0|0|0|扫描表(~250000 行) 0|0|0|使用 TEMP B-TREE 进行分组
在使用索引搜索表时,被扫描的行数(~250000 行)不应该更少吗???
我猜这里的问题在于 LIKE 关键字,因为我在某处读到 LIKE 关键字会使使用 if 索引无效...Here is the link
编辑:对于使用 LIKE 的查询的索引,LIKE 的右侧必须是不以通配符开头的字符串文字。所以,在上面的查询中,我尝试在开头没有'%'的情况下使用搜索参数:
EXPLAIN QUERY PLAN select <col1> from <TABLE> where <col1> like 'monit%' AND <col2> like '84%' GROUP BY <col1> limit 0,501;
我得到的输出是这样的:
0|0|0|使用索引查找表零件号 model_index_partnumber (model>? AND model
所以,你看。正在搜索(而不是扫描)的行数是(~15625 行)。 但现在的问题是我不能在一开始就取消 % 通配符。任何人请建议我另一种方法来实现同样的....
编辑: 我曾尝试从终端使用 FTS3,但是当我输入此查询时:
CREATE VIRTUAL TABLE <tbl> USING FTS3 (<col_list>);
它的抛出错误为: 错误:没有这样的模块:FTS3
请有人帮我从终端和 XCode 启用 FTS3(需要我必须为这两个任务执行的步骤)。
我正在使用 sqlcipher 并且已经从终端执行此操作:
CFLAGS="-DSQLITE_ENABLE_FTS3=1" ./configure
编辑:
请访问我发布的问题sqlite table taking time to fetch the records in LIKE query
编辑:
大家好,我取得了一些成功。我将选择查询修改为如下所示:
select distinct description collate nocase as description from partnumber where rowid BETWEEN 1 AND (select max(rowid) from partnumber) AND description like '%a%' order by description;
Bingo,搜索时间前所未有。但是现在的问题是,当我像这样执行命令 EXPLAIN QUERY PLAN 时,它显示我使用 B-Tree 来区分我不想使用的。
explain query plan select distinct description collate nocase as description from partnumber where rowid BETWEEN 1 AND (select max(rowid) from partnumber) AND description like '%a%' order by description;
输出:
0|0|0|SEARCH TABLE partnumber USING INTEGER PRIMARY KEY (rowid>? AND rowid<?) (~15625 rows)
0|0|0|EXECUTE SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE partnumber USING INTEGER PRIMARY KEY (~1 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT
【问题讨论】: