【发布时间】:2009-10-22 21:00:06
【问题描述】:
我有一个包含唯一 URL 的文本列。
我需要做一个 SQL 模式匹配查询,比如使用“like”SQL 运算符。
在这种情况下,无论我在该列上是否有索引(列是主键),SQLite 都会执行 FTS(全表扫描)吗?
这似乎是它在执行 FTS,因为操作速度正在说明 - 或者尽管列已编入索引,但由于“like”查询导致的速度影响?
【问题讨论】:
我有一个包含唯一 URL 的文本列。
我需要做一个 SQL 模式匹配查询,比如使用“like”SQL 运算符。
在这种情况下,无论我在该列上是否有索引(列是主键),SQLite 都会执行 FTS(全表扫描)吗?
这似乎是它在执行 FTS,因为操作速度正在说明 - 或者尽管列已编入索引,但由于“like”查询导致的速度影响?
【问题讨论】:
如果操作数字符串以通配符开头(“LIKE '%foo'”),LIKE 运算符将执行全表扫描。否则它将使用索引(如果可用)。
【讨论】:
4.0 LIKE 优化
由 LIKE 或 GLOB 运算符有时可用于 约束索引。有许多 使用条件:
- LIKE 或 GLOB 运算符的左侧必须是 索引列。
- LIKE 或 GLOB 的右侧必须是字符串文字 不以通配符开头 特点。 [...]
更新:默认case_sensitive_like模式为OFF。打开它可能会使它的行为类似于=。
PRAGMA case_sensitive_like = ON; -- OFF
SELECT * FROM your_table WHERE field LIKE '...'
【讨论】:
如果您的LIKE 在匹配表达式的开头使用通配符,例如'%hris McCall',则不会使用索引。
【讨论】: