改了ft_min_word_len没生效,主因是未重启MySQL服务且未重建全文索引;该参数仅对MyISAM生效,InnoDB需设innodb_ft_min_token_size=1,中文推荐用ngram解析器并设ngram_token_size=2。

为什么改了 ft_min_word_len 还没生效
改完配置不生效,几乎全是「没重启 MySQL」或「没重建全文索引」导致的。MySQL 不会在运行时动态加载这个参数,它只在启动时读取;而旧索引里已经按老规则分过词,新参数对存量索引完全无效。
- 必须修改
my.cnf(Linux)或my.ini(Windows)中的[mysqld]段落 - 必须重启 MySQL 服务,不能只用
SET GLOBAL或重载配置 - MyISAM 表需用
REPAIR TABLE table_name QUICK或myisamchk -r;InnoDB 表必须执行ALTER TABLE table_name DROP INDEX ft_index_name, ADD FULLTEXT (col1, col2)
不同引擎要配不同的最小词长参数
别只改 ft_min_word_len —— 它只影响 MyISAM 表。InnoDB 表用的是 innodb_ft_min_token_size,ngram 分词器(中文常用)则靠 ngram_token_size。三者互不干扰,必须按引擎类型分别设置。
- MyISAM:设
ft_min_word_len=1 - InnoDB:设
innodb_ft_min_token_size=1 - 启用 ngram(如
CREATE FULLTEXT INDEX ... WITH PARSER ngram):必须同时设ngram_token_size=1 - 所有参数改完后,都要重启 + 重建索引,缺一不可
中文场景下设成 1 是刚需,不是可选项
MySQL 默认值是 4,对英文尚可,但中文双字词(如“搜索”“索引”“配置”)直接被过滤掉,MATCH() AGAINST() 查不到任何结果。这不是性能问题,是功能残废。
- 查当前值:运行
SHOW VARIABLES LIKE 'ft_min_word_len'和SHOW VARIABLES LIKE 'innodb_ft_min_token_size' - 设为 1 后,重建索引前仍会返回空结果,这是正常现象
- 如果用 ngram,
ngram_token_size设为 1 意味着单字分词,可能产生大量噪音;实际建议设为 2(更符合中文分词习惯),但前提是确认业务能接受“搜‘数’找不到‘数据’”这类情况
重建全文索引时容易卡住或 OOM
重建过程会扫描全表、重新分词、写倒排索引,内存和 I/O 压力极大,尤其当字段含大量长文本时。曾有案例因并发重建 + 内存不足触发 Linux OOM Killer 杀掉 mysqld 进程。
- 避开业务高峰执行,最好在从库上先试
- 不要一次性重建多个大表,逐个操作并监控
SHOW PROCESSLIST - 若频繁 OOM,考虑临时调高
innodb_buffer_pool_size,但注意总内存不能超物理限制 - MyISAM 表重建期间表会被锁死,InnoDB 虽支持在线 DDL(5.6+),但全文索引重建仍会阻塞写入,这点常被忽略



















