【发布时间】:2011-06-09 03:01:47
【问题描述】:
我正在 iPhone 应用程序中执行带有多个 LIKE 子句的 SQLite 选择语句。语句类似于以下内容:
SELECT * FROM mytable
WHERE name LIKE 'Smith %'
OR name LIKE '% Smith %'
OR name LIKE 'Smith_%'
OR name LIKE '% Smith_%';
目前在我的笔记本电脑上执行大约需要 0.5 秒,在设备上大约需要 2 秒。由于空间限制,我无法索引“mytable”的“name”列。
每个 LIKE 子句都非常相似 - 如果一个失败,很可能它们每个都会失败。因此,我想将这些组合在一起一些如何优化我的搜索。
这可以通过 REGEXP 来实现吗?如果是,那么 REGEXP 是如何以及默认启用的?
编辑。我正在尝试以下语句:
SELECT * FROM mytable WHERE name REGEXP '[ _]?Smith[ _,]';
【问题讨论】:
-
我认为您对 REGEXP 的看法是正确的... SQLite 默认情况下不提供它的实现,所以它只有在您为其编写用户函数时才会存在(或者如果有一个在它的 iOS 实现中提供)。而且,不幸的是,我能想到的唯一优化将依赖于被索引的列。
-
@All:我在这方面取得了一些进展,事实上一直到现在。如果有兴趣我会在这里发帖。一件事 - 从
regex.h调用regcomp来生成内部正则表达式很昂贵(幸运的是regexec很快)。在我的情况下,内部正则表达式在查询过程中不会改变,所以我在一次regcomp调用后缓存它。这会产生 /massive/ 的不同。 -
索引通常不适用于
%...%构造,因此它很可能不适用于regexp,即使它可用。你被全表扫描困住了。 -
@Blindy:也许吧,虽然 REGEX 现在对我来说很好用,因为我可以放弃
%。我只需要将 4 或 5 个类似的 LIKE 运算符折叠成一个运算符,到目前为止一切顺利。