2017-08-14 55 views
0

如果你拿一张表,只是简单地将存储引擎引擎从MyISAM改为InnoDb,那么所有的WHERE MATCH (col1,col2,col3...) AGAINST (expr)都会返回与MyISAM下完全相同的结果吗?如果不是,有什么区别?MySQL的FULLTEXT搜索是否为MyISAM和InnoDb返回相同的结果?

我的意思是在全文检索方面只是差异,没有别的。这两款存储引擎显然存在其他巨大差异。

回答

4

实际上有在MyISAM和InnoDB全文搜索实现的一些显着的区别:

  • MyISAM的自然语言搜索(但不是布尔模式)具有50%的门槛,而InnoDB则没有按” t,所以非常(非常)的单词在MyISAM结果中排除。有一个在the manual关于它的一句话:

    的50%阈值可以令你感到惊讶,当你第一次尝试使用全文搜索,看看它是如何工作的,并让InnoDB表更适合实验用全文搜索。如果创建MyISAM表并仅插入一行或两行文本,则文本中的每个单词至少在行的50%中出现。因此,只有表格包含更多行时,搜索才会返回任何结果。

  • 了MyISAM stopword列表(即,不包含在全文索引,因此不能找到一个单词列表)比(默认)显著较长的一个通过InnoDB的使用,所以例如InnoDB可以找到“每个人”或“不幸”,但不能与MyISAM一起找到。 match against ('Mary Had a Little Lamb')通常会包含更多结果,因为“有”是MyISAM中的停用词,但不是InnoDB中的。

  • MyISAM和InnoDB使用不同的权重算法。 MyISAM认为例如一行中匹配字与非匹配字之间的比率,所以包含一个字的长句与含有该字的短句的相关性较小。虽然这只会改变其他方面相同结果集中的顺序,但这通常会对用户体验产生重大影响,并且用户将两个结果视为“相同”,这正是您所问的。这可能也是特别相关的,因为搜索通常包括一个限制,例如, order by score desc limit 10,因此可以产生完全不同的结果。

  • InnoDB支持""以匹配确切的短语(按给定顺序的单词),而MyISAM(至少在自然语言模式下)不支持。所以,如果你使用match against ('"Mary Had a Little Lamb"'),InnoDB只会返回一行,如果它包含这个精确的句子,而MyISAM会发现每一行包含任何这些词(除了上面提到的“had”和“a”,这两个词都在停用词表)。

  • 由于您使用的是自然语言模式,因此布尔搜索中的偏差可能与您无关,但要列出至少一个:两个引擎在搜索中对待停止(或短)单词的方式不同查询。如果您使用match against ('+about +Mary' in boolean mode)(“about”是两个引擎中的停用词),InnoDB将尝试在索引中找到该单词,尽管它不在此处,因此不会返回任何结果,而MyISAM将忽略该单词并返回结果可能不包含“约”,只包含“玛丽”。

此外,对于最小字长的默认值, ft_min_word_len对MyISAM(默认4)和innodb_ft_min_token_size InnoDB的(默认值3)是不同的,所以如果你不进行调整,InnoDB的指数将包含(并找到)更多的话。您也可能想要使用停用词列表来匹配对方。

如果这些差异与您的情况有关,将取决于您的数据,您的搜索模式以及您是否考虑使用不同的顺序来获得不同的结果。搜索主要由短期或固定格式组成的数据,例如产品代码或公司名称,或者您主要感兴趣查找特定词语的搜索,或者通常只会产生少量可能结果的搜索,这两个引擎中的搜索量通常会比实际英文文本中的搜索量要少,相关性分数的影响更大。

+1

这正是我以前的样子,谢谢你的详细回复。 – texelate

0

没有,有没有保证,一个InnoDB全文索引的工作完全相同的方式作为对同一数据的MyISAM全文索引相同。

我最后一次测试它(这是当InnoDB的FT还是Beta版),有肯定,其中InnoDB的FT没有返回一些行,在MyISAM的FT匹配的情况。它还返回了一些在MyISAM中匹配的行而不是

+0

虽然它们大致相同吗?我可以接受一些差异,但不是大不相同的结果。 – texelate

+0

为了清楚起见,我猜想知道这些差异是什么,因为我发现它的记载很差(即差异)。对我而言,这意味着MySQL希望我们认为它们几乎可以互换。 – texelate

+0

你必须自己测试一下。最后的区别可能取决于你的数据和你搜索的模式,以及你使用的MySQL版本。 –