【问题标题】:MySql can't decide between LIKE and MATCH for text searchMySql 无法在 LIKE 和 MATCH 之间决定文本搜索
【发布时间】:2015-02-08 14:10:21
【问题描述】:

我正在 Laravel 中构建一个应用程序。我无法决定使用Match()Like 进行文本搜索。

我只想对一列进行文本搜索,即Varchar(42)

我还将通过一些Where() 语句过滤掉查询,因此它不会对所有行进行文本搜索。

我使用的是 mysql 5.6+,所以 Match 可以与我的 innobd 引擎配合使用。

  1. Match() 在大约 30k 行的表中效果好吗?

  2. Laravel ORM 不支持匹配,所以我的查询如下所示:

    $q = Input::get('query');
    Post::whereRaw("MATCH(title) AGAINST(? IN BOOLEAN MODE)", array($q))->get();
    

为了避免 SQL 注入,我是否需要清理“$q”?由于我使用的是whereRaw()

【问题讨论】:

  • 是的,whereRaw 是安全的。使用绑定 (?) 可以保护它免受 SQL 注入。 @GordonLinoff 的回答涵盖了您的其余问题...

标签: php mysql sql laravel


【解决方案1】:

这两种能力完全不同,所以选择应该很容易。 MATCH 专注于文本中的单词。因此,如果您想按一个或多个单词进行搜索,那么MATCH 应该会更快。但是,MATCH 专注于单词,因此搜索数字、停用词和短词需要额外的努力。

LIKE 通常不能使用索引。这会减慢此类查询的速度,因为需要处理每一行。当然,如果其余的过滤将其减少到 100 行,那也没什么大不了的。

此外,LIKE 可以使用索引进行“前缀”搜索——即在字符串的开头进行搜索。所以,LIKE 'abc%' 可以使用索引。 `LIKE '%abc%' 不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多