MySQL 8.0 中 ft_min_word_len 等 MyISAM 专属变量已实质弃用,仅保留兼容性外壳;其功能由 innodb_ft_min_token_size 等 InnoDB 参数替代,修改后必须重建全文索引才生效。

ft_min_word_len、ft_max_word_len、ft_query_expansion_limit 这类 MyISAM 专属系统变量在 MySQL 8.0 中被进一步精简,根本原因不是“功能优化”,而是 MyISAM 已被移出系统表支撑体系,相关配置失去实际作用域。
MyISAM 全文索引参数只剩空壳
MySQL 8.0 所有系统表(mysql.user、mysql.db 等)强制使用 InnoDB,而全文索引功能在 InnoDB 中由独立实现支持(如 innodb_ft_* 系列参数),不再依赖 MyISAM 的 ft_* 参数。
-
ft_min_word_len等只对 MyISAM 表的FULLTEXT索引生效;InnoDB 表的全文行为由innodb_ft_min_token_size控制 - 即使你手动建一个 MyISAM 表并加
FULLTEXT,这些参数仍存在,但已不参与系统级权限/角色/数据字典的构建流程 -
SHOW VARIABLES LIKE 'ft%'还能查到它们,只是因为兼容性保留——底层代码里它们不再被内核读取或校验
MySQL 8.0 启动时会忽略 MyISAM 变量的合法性检查
旧版(5.7)若在配置文件中写错 ft_min_word_len=0(非法值),mysqld 启动会报错退出;8.0 中这类错误仅记录为 warning,甚至不记日志,因为变量路径已从初始化关键链路中剥离。
- 启动阶段不再调用 MyISAM 引擎的
ha_myisam::init()来校验全文参数 - 如果配置了
default-storage-engine=MyISAM,8.0 会静默覆盖为InnoDB,且不报错 -
mysqld --validate-config不再检查ft_*的取值范围,哪怕设成负数也不会失败
真正该关注的是 InnoDB 对应参数的迁移
如果你业务还依赖全文检索,别试图调 ft_min_word_len,得改用 InnoDB 的等效配置:
- MyISAM 的
ft_min_word_len=4→ InnoDB 的innodb_ft_min_token_size=4 - MyISAM 的
ft_query_expansion_limit=10→ InnoDB 没有直接对应项,需靠INFORMATION_SCHEMA.INNODB_FT_CONFIG和查询重写逻辑控制 - 修改后必须重建全文索引:
ALTER TABLE t DROP INDEX ft_idx; ALTER TABLE t ADD FULLTEXT(ft_col);
别被 SHOW VARIABLES 欺骗
运行 SHOW VARIABLES LIKE 'ft%' 看到结果不等于它还在起作用。MySQL 8.0 保留这些变量名,纯粹为了向前兼容客户端工具和脚本,但内核早已绕过它们。
- 查
information_schema.global_variables也能看到值,但那是静态字符串缓存,非运行时读取 - 哪怕把
ft_min_word_len设成 100,MyISAM 表的全文查询也不会报错——只是索引构建时直接跳过所有词,结果为空 - 最隐蔽的坑:某些运维脚本用
ft%正则匹配所有全文相关变量做备份,结果备份了一堆无用字段
mysql_upgrade 命令一样,已是名义存在、实质弃用——你改了,MySQL 不看;你不改,也不影响任何核心流程。


















