【发布时间】:2011-04-07 10:56:29
【问题描述】:
我最近正在从一个包含大约 50k 个字符串的表中进行一些字符串搜索,我会说相当大,但没有那么大。我正在为“在结果中搜索”做一些嵌套查询。我正在使用 LIKE 语句来获得搜索关键字的匹配。
我遇到了我尝试过的 MySQL 全文搜索,因此我在我的 str 列中添加了全文索引。我知道全文搜索不适用于虚拟创建的表,甚至不适用于Views,因此不适合带有子选择的查询。我提到我在做一个嵌套查询,例子是:
SELECT s2.id, s2.str
FROM
(
SELECT s1.id, s1.str
FROM
(
SELECT id, str
FROM strings
WHERE str LIKE '%term%'
) AS s1
WHERE s1.str LIKE '%another_term%'
) AS s2
WHERE s2.str LIKE '%a_much_deeper_term%';
这实际上还没有应用于任何代码,我只是在做一些测试。此外,使用 Sphinx(性能方面)可以轻松实现这样的搜索字符串,但让我们考虑 Sphinx 不可用,我想知道这将如何在纯 SQL 查询中正常工作。在未添加全文的表上运行此查询大约需要 2.97 secs。 (取决于搜索词)。但是,在将全文添加到str 列的表上运行此查询在 104 毫秒内完成,这很快(我认为?)。
我的问题很简单,使用 LIKE 是否有效,或者在通常我们使用 MATCH 和 AGAINST 陈述?
谢谢!
【问题讨论】:
-
您始终可以在嵌套 SQL 的 innermost 查询中使用全文索引。当然,这取决于您是否在搜索 wole words。
-
@vbence 太棒了,我刚刚尝试在最里面的查询中,结果在 15 毫秒内完成。顺便说一句,这是在我的本地主机中,但是将 WHERE str LIKE '%term%' 替换为 WHERE MATCH(str) AGAINST('term') 会更快:)
-
最大的问题是,您只搜索完整的单词吗?
-
@vbence 不,字符串出现在字符串中。但是你是对的,如果它是一个完整的单词搜索,最好在最里面使用 fullindex。谢谢提醒