什么通常更快,通过文件grepping或通过blob运行SQL LIKE%x%查询?

dan*_*dan 8 mysql postgresql grep ack

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

grep并且ack一直很好,但是将数据存储在数据库中会使得大量的东西在某些方面更易于管理.我想知道grep在一个目录树上递归运行的相对性能与运行像SQL的LIKE或MySQL的REGEXP函数这样的查询相比,在TEXT blobs上运行相同数量的记录.

Den*_*rdy 4

如果您有 100 万个文件需要 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);
Run Code Online (Sandbox Code Playgroud)

这将比 grep 的任何操作都要快得多。