2015-02-08 114 views
0

我正在Laravel構建一個應用程序。我不能決定用Match()Like進行文本搜索。MySql無法在LIKE和MATCH之間進行文本搜索

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

我也會過濾一些Where()語句的查詢,所以它不會對所有行進行文本搜索。

我正在使用mysql 5.6+,所以匹配我的innobd引擎。

  1. Match()在具有大約30k行的表中表現不錯嗎?

  2. Laravel ORM犯規支持的比賽,所以我的查詢如下所示:

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

我需要消毒「$ Q」,以從SQL注入安全嗎?由於我使用的是whereRaw()

+1

是的'whereRaw'是安全的。使用綁定('?')可以防止SQL注入。你的問題的其餘部分在@ GordonLinoff的答案中進行了介紹...... – lukasgeiter 2015-02-08 14:19:55

回答

1

這兩個功能是完全不同的,所以選擇應該很容易。 MATCH專注於文字中的單詞。所以,如果你想搜索一個或多個單詞,那麼MATCH應該更快。但是,MATCH專注於單詞,所以搜索數字,停用詞和短語需要額外的努力。

LIKE一般不能使用索引。這會減慢這樣的查詢,因爲每一行都需要處理。當然,如果其餘的過濾將其減少到100行,那麼這不是什麼大問題。

另外,LIKE可以使用索引進行「前綴」搜索 - 即在字符串的開始處進行搜索。所以,LIKE 'abc%'可以使用一個索引。 `LIKE'%abc%'不能。