sqlite – 可以优化LIKE语句以不进行全表扫描吗?

我希望通过树路径从表中获取子树.

path列存储字符串,如:

foo/
foo/bar/
foo/bar/baz/

如果我尝试选择以某个路径开头的所有记录:

EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE "foo/%"

它告诉我表被扫描,即使路径列被索引:(

有什么方法可以使LIKE使用索引而不扫描表吗?

我找到了一种方法来实现我想要的闭包表,但它更难维护和写入非常慢……

为了能够在SQLite中使用LIKE索引,

>表列必须具有TEXT affinity,即具有TEXT或VARCHAR类型或类似的类型;和
>索引必须声明为COLLATE NOCASE(直接或因为该列已声明为COLLATE NOCASE):

> CREATE TABLE f(path TEXT);
> CREATE INDEX fi ON f(path COLLATE NOCASE);
> EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE 'foo/%';
0|0|0|SEARCH TABLE f USING COVERING INDEX fi (path>? AND path<?)

可以使用case_sensitive_like PRAGMA删除第二个限制,但这会改变LIKE的行为.
或者,可以使用区分大小写的比较,将LIKE’foo /%’替换为GLOB’foo / *’.

https://stackoverflow.com/questions/20423387/can-the-like-statement-be-optimized-to-not-do-full-table-scans

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:sqlite – 可以优化LIKE语句以不进行全表扫描吗?