问题:通常更快,通过文件搜索或通过 Blob 运行 SQL LIKE %x% 查询?

假设我正在设计一个将代码片段保存在 PostgreSQL/MySQL 数据库或文件系统中的工具。我想搜索这些片段。使用像 Sphinx 这样的搜索引擎似乎并不实用,因为我们在搜索代码时需要代码的精确文本匹配。

grepack一直运行良好,但是将内容存储在数据库中会使大量内容在某些方面更易于管理。我想知道在目录树上递归运行grep与在具有 TEXT blob 的等量记录上运行 SQL 的 LIKE 或 MySQL 的 REGEXP 函数等查询的相对性能是什么。

解答

如果您有 1M 文件要通过 grep,您将(最好我知道)使用正则表达式遍历每个文件。

出于所有意图和目的,如果您使用 LIKE 运算符或正则表达式对表行进行大规模查询,您最终将对表行执行相同的操作。

我自己对 grep 的经验是,我很少寻找不包含至少一个完整单词的内容,因此您可以利用数据库来减少您正在搜索的集合。

MySQL 具有原生的全文搜索功能,但我建议不要这样做,因为它们意味着您没有使用 InnoDB。

您可以在此处阅读来自 Postgres 的内容:

http://www.postgresql.org/docs/current/static/textsearch.html

在 tsvector 列上创建索引后,您可以分两步执行“grep”,一个是立即查找可能模糊符合条件的行,然后是另一个根据您的真实条件的行:

select * from docs where tsvcol @@ :tsquery and (regexp at will);

这将比 grep 可以做的任何事情都要快得多。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐