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

前端之家收集整理的这篇文章主要介绍了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 / *’.

猜你在找的Sqlite相关文章