加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 19:13:03 所属栏目:百科 来源:网络整理
导读:我希望通过树路径从表中获取子树. path列存储字符串,如: foo/foo/bar/foo/bar/baz/ 如果我尝试选择以某个路径开头的所有记录: EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE "foo/%" 它告诉我表被扫描,即使路径列被索引:( 有什么方法可以使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 / *’.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读