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类型或类似的类型;和 > 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 / *’. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |