基本上,我有一个巨大的表(约3000万条记录),有一个 fulltext
在其中一列建立索引。
搜索查询如下所示:
... WHERE MATCH(body) AGAINST('+Hello +my*' IN BOOLEAN MODE) ...
我的存储引擎是innodb,所以我们有一些限制:
最小字长为3个字符。
然而,文件上说:
如果一个单词是用截断运算符指定的,那么即使它太短(根据ft\u min\u word\u len设置确定)或是停止字,也不会从布尔查询中删除它。之所以会出现这种情况,是因为没有将单词视为太短或停止词,而是将其视为前缀,而前缀必须以以前缀开头的单词的形式出现在文档中。假设ft\u min\u word\u len=4。
问题是:在这种情况下mysql将如何使用ft索引?这个词 bae
不应该出现在任何索引中,因为它不符合最小字长的要求。也许这样的查询会慢一点?
1条答案
按热度按时间yb3bgrhw1#
查询可能会稍微慢一点,但不是您推理的结果。
最小字长设置也在创建索引时使用,因此innodb不会索引比最小字长短的字。
在执行全文搜索的过程中,innodb再次根据最小字长限制检查正在搜索的单词的长度,并消除因为在索引中找不到而比限制短的单词。如果你的搜索条件是
'my'
(注意没有asterix),这将被innodb忽略。但是,当使用通配符运算符时,字符数小于限制(例如
my*
,只有两个字符),这些字符仍然包含在搜索中,因为innodb将查看模式,而不仅仅是单词。显然,只检查完全匹配比检查完全匹配和单词开头要快,但速度上不会有显著差异。