【问题标题】:SQLite always does a Full Table Scan when like used?SQLite 在使用时总是进行全表扫描?
【发布时间】:2009-10-22 21:00:06
【问题描述】:

我有一个包含唯一 URL 的文本列。

我需要做一个 SQL 模式匹配查询,比如使用“like”SQL 运算符。

在这种情况下,无论我在该列上是否有索引(列是主键),SQLite 都会执行 FTS(全表扫描)吗?

这似乎是它在执行 FTS,因为操作速度正在说明 - 或者尽管列已编入索引,但由于“like”查询导致的速度影响?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    如果操作数字符串以通配符开头(“LIKE '%foo'”),LIKE 运算符将执行全表扫描。否则它将使用索引(如果可用)。

    【讨论】:

      【解决方案2】:

      The SQLite Query Planner

      4.0 LIKE 优化

      由 LIKE 或 GLOB 运算符有时可用于 约束索引。有许多 使用条件:

      1. LIKE 或 GLOB 运算符的左侧必须是 索引列。
      2. LIKE 或 GLOB 的右侧必须是字符串文字 不以通配符开头 特点。 [...]

      更新:默认case_sensitive_like模式为OFF。打开它可能会使它的行为类似于=

      PRAGMA case_sensitive_like = ON; -- OFF
      SELECT * FROM your_table WHERE field LIKE '...'
      

      【讨论】:

      • like 的左边是主键,右边是一个常量字符串,有时后跟一个通配符。正如我所说,大多数“模式”字符串都是常量——比如'ftp:abs.com'——所以根本不需要使用like!只是为了它,我写了一个单行,当没有通配符时,它调用一个使用'='而不是'like'的查询版本,而且速度更快-'='需要3秒才能完成'像'42分钟!如果不使用通配符,有没有办法让 'like' 调用 '='?
      • ..我今天会看看,让你知道。
      • 在时间上完全没有区别 - 我需要共享数据库 - 但问题是这些值非常机密 - 共享架构和 PERL 代码就足够了吗?
      【解决方案3】:

      如果您的LIKE 在匹配表达式的开头使用通配符,例如'%hris McCall',则不会使用索引。

      【讨论】:

      • 不幸的是,通配符 '%' 被用作后缀 - 在常量文本之后 - 类似于 'FTP%' 令人惊奇的是,我刚刚完成了一点数据分析,它看起来像大多数“模式”字符串都是常量——比如'abs.com'——所以根本不需要使用like!只是为了它,我写了一个单行,当没有通配符时,它调用一个使用'='而不是'like'的查询版本,而且速度更快-'='需要3秒才能完成'像'42分钟!如果不使用通配符,有没有办法让 'like' 调用 '='?
      • 为什么要使用 SQLite 来做一个有足够数据需要 42 分钟的项目?那一定是数百 GB 的数据。
      • ...也许不是数百,但可能是数十。
      • 不!这适用于大约 12MB 的 db。注意使用 'like' 与 '=' 的时间差异
      • 12MB 数据库需要 42 分钟?这有点难以置信。您介意共享查询和表架构吗?
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2020-01-10
      相关资源
      最近更新 更多