Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite LIKE语句是否可以优化为不进行全表扫描?_Sqlite_Query Optimization_Sql Like - Fatal编程技术网

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使用索引

  • 表列必须有文本,即有一种文本或VARCHAR或类似的类型;以及
  • 索引必须声明为COLLATE NOCASE(直接声明,或者因为列已声明为COLLATE NOCASE):

    >创建表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<?)