SQLite';合并';LIKE使用的前缀?

SQLite';合并';LIKE使用的前缀?,sqlite,Sqlite,我有一个类似的问题 select * from tbl where name like 'a%' or name like 'abc%'; SQLite是否分别搜索“a%”和“abc%”?它会检查abc%是否包含在a%中,并且只进行一次搜索吗 “解释查询计划”返回 “0”0“0”搜索表跟踪使用主键(名称>?和名称 SQLite是否分别搜索“a%”和“abc%”?是否检查abc%是否正确 按%包含,并且只执行一次搜索 我认为两者都不是正确答案,因为它似乎介于给出的两个选项之间 我认为通过拖网记

我有一个类似的问题

select * from tbl where name like 'a%' or name like 'abc%';
SQLite是否分别搜索“a%”和“abc%”?它会检查abc%是否包含在a%中,并且只进行一次搜索吗

“解释查询计划”返回

“0”0“0”搜索表跟踪使用主键(名称>?和名称
SQLite是否分别搜索“a%”和“abc%”?是否检查abc%是否正确
按%包含,并且只执行一次搜索

我认为两者都不是正确答案,因为它似乎介于给出的两个选项之间


我认为通过拖网记录可以解释一点

第一个呼叫端口是。这表示:-

如果WHERE子句由OR分隔的约束组成 然后,整个条款被视为一个单独的“术语” 应用了OR子句优化的

此外,它还指出:-

如果查询的WHERE子句包含OR表达式,则SQLite 可能使用“或按联盟”策略(此处也有描述)

  • 以下链接至1.8。或WHERE条款中的相关条款
在这个 案例将有两个搜索记录,每个索引一个,带有 “订单”和“发件人”列中的值相同。例如:

sqlite> CREATE INDEX i3 ON t1(b);
sqlite> EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2;
0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)
0|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?)
因此,很明显,“或按联盟”策略正在被使用,正如您所做的那样:-

"0" "0" "0" "SEARCH TABLE traces USING PRIMARY KEY (name>? AND name<?)"
"0" "0" "0" "SEARCH TABLE traces USING PRIMARY KEY (name>? AND name<?)"
当遇到WHERE子句中的术语或相关术语时,SQLite 分别检查每个或术语,并尝试使用索引查找 与每个术语相关联的rowids。然后它接受 结果rowid集合以查找最终结果 说明了此过程:

上图暗示SQLite计算所有的rowid 首先,然后将它们与联合操作组合,然后再开始 在原始表上进行rowid查找。实际上,rowid查找 SQLite一次使用一个索引 是时候找到rowid了,同时记住它以前见过哪些rowid 以避免重复。这只是一个实施细节, 尽管如此,该图虽然不是100%准确,但提供了一个很好的概述 关于正在发生的事情

为了使上面显示的OR by UNION技术有用,有 必须是有助于解析每个术语或连接术语的可用索引 在WHERE子句中。如果即使是单个或连接的术语 索引,则必须进行完整的表扫描才能找到 由一个术语生成的rowid,如果SQLite必须执行完整的 表扫描,也可以在原始表上执行,并获取所有 在一次通过的情况下,不必与工会发生冲突 操作和后续的二进制搜索

我们可以看到,OR by UNION技术也可以用来 在where子句包含术语的查询上使用多个索引 通过和连接,使用相交操作符代替并集。 许多SQL数据库引擎都会做到这一点,但性能会有所提高 仅仅使用一个索引是很轻微的,所以SQLite不会 现在实现该技术。但是,未来的版本 SQLite可能会通过INTERSECT得到增强,以支持和删除

另一个考虑因素是。不过,我相信这只是基于类似条款

"0" "0" "0" "SEARCH TABLE traces USING PRIMARY KEY (name>? AND name<?)"
"0" "0" "0" "SEARCH TABLE traces USING PRIMARY KEY (name>? AND name<?)"
SELECT price FROM FruitsForSale WHERE fruit='Orange' OR state='CA';