4

我有一个大约 80000 行的表。我需要进行如下搜索:SELECT * FROM names WHERE name LIKE 'abc%'. 通配符总是在最后。即使有索引,在 Android 上也太慢了。我怎样才能让它更快?是否可以强制 sqlite 在内部对文本列执行二进制搜索?

4

1 回答 1

7

普通索引不会以不区分大小写的方式对条目进行排序,这对于LIKE.

要使LIKE 优化起作用,您需要一个NOCASE索引:

> CREATE TABLE names(name TEXT);
> CREATE INDEX i1 ON names(name);
> EXPLAIN QUERY PLAN SELECT * FROM names WHERE name LIKE 'abc%';
SCAN TABLE names USING COVERING INDEX i1 (~500000 rows)
> CREATE INDEX i2 ON names(name COLLATE NOCASE);
> EXPLAIN QUERY PLAN SELECT * FROM names WHERE name LIKE 'abc%';
SEARCH TABLE names USING COVERING INDEX i2 (name>? AND name<?) (~31250 rows)

如果您想要区分大小写的搜索,则可以GLOB改用:

> EXPLAIN QUERY PLAN SELECT * FROM names WHERE name GLOB 'abc*';
SEARCH TABLE names USING COVERING INDEX i1 (name>? AND name<?) (~31250 rows)
于 2013-06-09T12:27:55.177 回答