2017-08-14 84 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版本。 –

相關問題