如果你拿一张表,只是简单地将存储引擎引擎从MyISAM改为InnoDb,那么所有的WHERE MATCH (col1,col2,col3...) AGAINST (expr)
都会返回与MyISAM下完全相同的结果吗?如果不是,有什么区别?MySQL的FULLTEXT搜索是否为MyISAM和InnoDb返回相同的结果?
我的意思是在全文检索方面只是差异,没有别的。这两款存储引擎显然存在其他巨大差异。
如果你拿一张表,只是简单地将存储引擎引擎从MyISAM改为InnoDb,那么所有的WHERE MATCH (col1,col2,col3...) AGAINST (expr)
都会返回与MyISAM下完全相同的结果吗?如果不是,有什么区别?MySQL的FULLTEXT搜索是否为MyISAM和InnoDb返回相同的结果?
我的意思是在全文检索方面只是差异,没有别的。这两款存储引擎显然存在其他巨大差异。
实际上有在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的指数将包含(并找到)更多的话。您也可能想要使用停用词列表来匹配对方。
如果这些差异与您的情况有关,将取决于您的数据,您的搜索模式以及您是否考虑使用不同的顺序来获得不同的结果。搜索主要由短期或固定格式组成的数据,例如产品代码或公司名称,或者您主要感兴趣查找特定词语的搜索,或者通常只会产生少量可能结果的搜索,这两个引擎中的搜索量通常会比实际英文文本中的搜索量要少,相关性分数的影响更大。
没有,有没有保证,一个InnoDB全文索引的工作完全相同的方式作为对同一数据的MyISAM全文索引相同。
我最后一次测试它(这是当InnoDB的FT还是Beta版),有肯定,其中InnoDB的FT没有返回一些行,在MyISAM的FT匹配的情况。它还返回了一些在MyISAM中匹配的行而不是。
这正是我以前的样子,谢谢你的详细回复。 – texelate