【问题标题】:Which SQL query is better, MATCH AGAINST or LIKE?哪个 SQL 查询更好,MATCH AGAINST 还是 LIKE?
【发布时间】:2010-10-22 00:41:10
【问题描述】:

要在数据库中搜索“foo_desc”和“bar_desc”列中同时包含关键字“foo”和“bar”的行,我会执行以下操作:

SELECT * 
FROM t1 
WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST ('+foo* +bar*' IN BOOLEAN MODE)

SELECT * 
FROM t1 
WHERE (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%foo%') AND (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%bar%')

我预计最后一个查询的缺点是性能。

好处是 LIKE 查询会找到 MATCH AGAINST 找不到的 'xxfoo'。

哪个是首选还是有更好的解决方案?

【问题讨论】:

    标签: sql mysql database search


    【解决方案1】:

    更新

    截至MySQL 5.6 及更高版本,InnoDB 表支持Match... Against


    第一个好多更好。在 MyISAM 表上,它将对这些列使用全文索引。另一个将进行全表扫描,对每一行进行连接,然后进行比较。

    LIKE 仅在您反对时才有效:

    • 一列(不是函数的结果,除非您的特定数据库供应商支持函数索引,例如 Oracle,并且您正在使用它们);
    • 列的开始(即LIKE 'blah%',而不是LIKE '%blah%');和
    • 已编入索引的列。

    如果其中任何一个条件不成立,SQL 引擎执行查询的唯一方法就是执行全表扫描。这可以在大约 10-20000 行下使用。但是,除此之外,它很快就会变得无法使用。

    注意: MySQL 上 MATCH 的一个问题是它似乎只匹配整个单词,因此搜索 'bla' 不会匹配值为 'blah' 的列,但是搜索“bla*”即可。

    【讨论】:

    • 评论你的笔记:如果你搜索 bla*,MATCH 将返回值为 blah 的列
    • @Strae The minimum and maximum lengths of words to be indexed are defined by the innodb_ft_min_token_size and innodb_ft_max_token_size for InnoDB search indexes, and ft_min_word_len and ft_max_word_len for MyISAM ones. dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2015-10-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多