2016-07-26 110 views
-2

我试图做一个非常快速的&有效的方法来获取记录使用关键字作为搜索。LIKE%或AGAINST用于FULLTEXT搜索?

我们的MYSQL表MASTER tablescontains 30,000行,有4个字段。

  • ID
  • 标题(FULLTEXT
  • short_descr(FULLTEXT
  • long_descr(FULLTEXT

任一项能否提供它是一个更有效?

  • LIKE%
  • MySQL的反对

这将是很好,如果有一个人可以写一个SQL查询的关键字 减肥秘笈

SELECT id FROM MASTER 
WHERE (title LIKE '%Weight Loss Secrets%' OR 
     short_descr LIKE '%Weight Loss Secrets%' OR 
     long_descr LIKE '%Weight Loss Secrets%') 

非常感谢e

+1

全文索引应该更快。 –

+0

“LIKE OR LIKE OR LIKE”会让您的服务器着火。 – Piskvor

+0

两者都有不同的用途。 'AGAINST'返回一个可用于根据相关性对结果进行排序的数字,匹配时单词的顺序无关紧要。 “LIKE”执行完全匹配,并且没有相关性分数。更快是无关紧要的。 –

回答

1

FULLTEXT索引应该更快,也许它是一个好主意,将所有列添加到1全文索引。

ALTER TABLE MASTER 
ADD FULLTEXT INDEX `FullTextSearch` 
(`title` ASC, `short_descr` ASC, `long_descr` ASC); 

然后执行使用IN BOOLEAN MODE

SELECT id FROM MASTER WHERE 
MATCH (title, short_descr, long_descr) 
AGAINST ('+Weight +Loss +Secrets' IN BOOLEAN MODE); 

这就会发现,包含所有3个关键字行。

但是,这不会给你完全匹配的关键字只需要在同一行中存在。

如果你也想要精确匹配,你可以这样做,但它有点不好,只有当你的表没有变大时才会工作。

SELECT id FROM 
(
SELECT CONCAT(title,' ',short_descr,' ', long_descr) AS SearchField 
FROM MASTER WHERE 
MATCH (title, short_descr, long_descr) 
AGAINST ('+Weight +Loss +Secrets' IN BOOLEAN MODE) 
) result WHERE SearchField LIKE '%Weight Loss Secrets%'