MySQL中ft_stopword_file对压缩表不生效的原因及修复方法
问题成因
ft_stopword_file配置只在MyISAM全文索引创建、重建的阶段生效,停用词过滤规则会直接固化在生成的索引文件中,后续即使修改配置重启MySQL,也不会改动已经建好的全文索引的过滤逻辑。- 用
myisampack压缩MyISAM表时会重写表的数据存储结构,原有的全文索引会直接失效,压缩流程默认会调用myisamchk执行索引重建操作,适配压缩后的数据格式。 - 核心问题:
myisamchk是独立于mysqld进程的离线工具,它默认只会读取my.cnf里[myisamchk]段的参数,不会加载[mysqld]段的配置。你只给mysqld配置了ft_stopword_file = "",myisamchk重建全文索引时读不到这个规则,就会加载MySQL内置的默认停用词列表,把所有默认停用词从索引中剔除,最终查询停用词时自然返回空结果。
修复方案
- 先把已经压缩出问题的表解包恢复:
myisamchk --unpack 你的表名.MYI
注意执行这个命令前要停掉mysqld服务,或者确认没有任何进程在操作对应表文件,避免表损坏。
- 修改
my.cnf配置,在[myisamchk]段下追加和[mysqld]段一致的停用词配置,保证两边规则统一:
[myisamchk] ft_stopword_file = "" # 段内原有的其他配置保留即可
- 重新走压缩流程:
- 先执行
myisampack 你的表名.MYI完成数据压缩 - 再执行
myisamchk --rq --sort-index --analyze 你的表名.MYI重建索引,这一步生成的全文索引就会按照“无停用词”的规则构建,不会过滤任何词条
- 先执行
- 启动mysqld服务后执行
FLUSH TABLES;刷新表缓存,再查询停用词即可正常返回结果。
补充注意:后续只要用myisamchk对带全文索引的MyISAM表做修复、重建索引操作,都要保证myisamchk读到的ft_stopword_file配置和索引初始构建时的配置一致,否则会再次出现同类问题。
内容的提问来源于stack exchange,提问作者Jeick9
相关产品推荐
相关产品推荐

