Sqlite LIKE语句是否可以优化为不进行全表扫描?
我想通过树路径从表中获取子树Sqlite LIKE语句是否可以优化为不进行全表扫描?,sqlite,query-optimization,sql-like,Sqlite,Query Optimization,Sql Like,我想通过树路径从表中获取子树 path列存储如下字符串: foo/ foo/bar/ foo/bar/baz/ 如果我尝试选择以特定路径开头的所有记录: EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE "foo/%" 它告诉我该表已被扫描,即使path列已被索引:( 有没有什么方法可以让我使用索引而不扫描表 我找到了一种方法来实现我想要的闭包表,但是它很难维护,而且写的速度非常慢……LIKE对索引的优化有严格的要求 如果您可以稍微放宽您的
path
列存储如下字符串:
foo/
foo/bar/
foo/bar/baz/
如果我尝试选择以特定路径开头的所有记录:
EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE "foo/%"
它告诉我该表已被扫描,即使path
列已被索引:(
有没有什么方法可以让我使用索引而不扫描表
我找到了一种方法来实现我想要的闭包表,但是它很难维护,而且写的速度非常慢……
LIKE
对索引的优化有严格的要求
如果您可以稍微放宽您的要求,您可以使用字典排序来获得索引查找,例如
SELECT * FROM f WHERE PATH >= 'foo/' AND PATH < 'foo0'
从f中选择*其中路径>='foo/'和路径<'foo0'
其中0
是/
之后的下一个字符
这与优化器在满足优化要求的情况下对
LIKE
s所做的优化基本相同。为了能够在SQLite中为LIKE使用索引
>创建表f(路径文本);
>在f上创建索引fi(路径整理NOCASE);
>解释查询计划从f中选择*路径,如“foo/%”;
0 | 0 | 0 | 0 |使用覆盖索引fi搜索表f(路径>),pathI正在阅读同一页,但得出了不同的结论。在第4章中,它指出它可以在非常严格的规则下进行优化。感谢这一个使用搜索:)查询看起来有点奇怪
> 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<?)