mysql 8.0 彻底移除内置停用词表,完全依赖 ft_stopword_file 外部文件,且需重建全文索引、optimize table 才能使停用词和 ft_min_word_len 等变更生效;新增 innodb_ft_enable_stopword 开关,默认开启停用词过滤。

ft_stopword_file 配置项默认值变了,且 8.0 彻底移除了内置停用词表硬编码逻辑
ft_min_word_len 和 ft_max_word_len 的生效方式更严格,尤其在重启后必须显式 reload
MySQL 5.7 全文索引默认启用内置停用词表(如 “the”、“is”、“in” 等),且无法完全禁用——即使设 ft_stopword_file='' 或指向空文件,InnoDB 仍会加载内部列表。
而 MySQL 8.0 移除了该内置表,完全依赖 ft_stopword_file 指向的外部文件;若未配置或文件为空,则不应用任何停用词过滤。
- 5.7 中改停用词需修改
my.cnf并重启,但即便设ft_stopword_file=/dev/null,仍可能看到SELECT MATCH(...) AGAINST('the')返回空结果 - 8.0 中必须明确指定有效路径(如
ft_stopword_file=/etc/mysql/stopwords.txt),且文件需 UTF-8 编码、每行一个词、无 BOM、无空行,否则启动报错或静默失效 - 修改后,5.7 只需重启 mysqld;8.0 还需对含全文索引的表执行
ALTER TABLE t DROP INDEX idx_ft, ADD FULLTEXT INDEX idx_ft(col)才能重新解析词典
ft_min_word_len 在 5.7 中对 MyISAM 和 InnoDB 行为不一致:MyISAM 尊重该值,InnoDB 却常忽略(尤其短词如 “a”、“I”);8.0 统一强制校验,且要求重建全文索引才能生效——不重建的话,旧索引里已分词的短词仍可被匹配
innodb_ft_enable_stopword 是 8.0 新增开关,控制是否启用停用词过滤(默认 ON)。它只在 ft_stopword_file 有效时起作用;设为 OFF 后,哪怕停用词文件存在,也会跳过过滤。5.7 没有这个开关,停用词逻辑不可关闭
最易被忽略的是:8.0 中停用词变更后,不会自动刷新已有全文索引的倒排表。哪怕你更新了 stopword 文件并重启,老数据里的停用词依然在索引中——必须 OPTIMIZE TABLE t 或重建索引,否则查询行为不一致。这点和普通 B+ 树索引不同,是全文索引特有的“冷数据残留”问题。











