不能用了——MySQL 8.0.33起MyISAM被标记为deprecated,8.4版本已正式移除;其全文索引不支持事务、行级锁、ngram分词器、QUERY EXPANSION及邻近搜索,且崩溃易损坏,重建锁表,中文支持差。

MyISAM全文索引还能用吗?别踩“已弃用”这个坑
不能用了——MySQL 8.0.33 起,MyISAM 存储引擎已被标记为 deprecated;8.4 版本(2025 年底已发布)起正式移除。线上还在用 MyISAM 全文索引的系统,现在就该迁移,不是“要不要”,而是“还剩多少时间”。
MyISAM 的全文索引虽快(尤其小数据量),但它不支持事务、无行级锁、崩溃后索引易损坏,且其分词逻辑硬编码、无法调 ft_min_word_len(仅对 InnoDB 生效)。更关键的是:它压根不支持中文 ngram 分词器,WITH PARSER ngram 在 MyISAM 上直接报错 ERROR 1235 (42000): This version of MySQL doesn't yet support 'FULLTEXT WITH PARSER'。
- MyISAM 全文索引只支持
IN NATURAL LANGUAGE MODE和IN BOOLEAN MODE,没有WITH QUERY EXPANSION - MyISAM 不维护文档 ID 映射,无法做邻近搜索(
"MySQL performance"精确短语查不到) - 重建索引用
REPAIR TABLE,但会锁全表,高峰期执行等于主动拒绝服务
InnoDB 全文索引必须配哪些参数才不白建
建了 FULLTEXT 索引却搜不出“AI”“云”“数”这种两字词?大概率是参数没调。InnoDB 的全文行为高度依赖配置项,且修改后必须重启 MySQL 才生效——这点常被忽略。
-
innodb_ft_min_token_size:控制最小索引词长,默认值是2(MySQL 8.0+),但旧配置可能仍是3或4;中文场景建议设为2,否则“大模型”会被切成“大”“模”“型”,而“大”“模”是停用词,直接丢弃 -
ngram_token_size:ngram 分词器的核心参数,决定切分窗口大小;SET GLOBAL ngram_token_size = 2表示按二元切分(“人工智能”→“人工”“智能”);设为1就退化成单字索引,召回高但噪音爆炸;设为3则漏掉大量双字热词 -
innodb_ft_cache_size和innodb_ft_total_cache_size:千万级表必须调大,否则索引加载慢、查询抖动明显;建议分别设为256M和2G,但要确保物理内存够用
为什么 MATCH AGAINST 搜中文总返回空?检查这三处
建了带 WITH PARSER ngram 的索引,也改了 ngram_token_size,但 MATCH(title, content) AGAINST('数据库' IN NATURAL LANGUAGE MODE) 还是没结果——问题往往不在 SQL,而在底层数据和字符集。
- 表和字段必须用
utf8mb4字符集,且排序规则为utf8mb4_0900_as_cs或至少utf8mb4_unicode_ci;用latin1或utf8(非 mb4)会导致 ngram 解析器静默失败 - 插入数据前没做清洗:含不可见控制字符(如
\u200b零宽空格)、换行符混在标题里,ngram 解析器会跳过整段 token 提取 - 没触发索引同步:InnoDB 全文索引是异步刷新的,新插入/更新的数据不会立刻进倒排索引;可手动执行
OPTIMIZE TABLE articles强制合并 FTS cache,或等后台线程(默认 30 秒)自动刷入
布尔模式(BOOLEAN MODE)怎么写才不查偏
自然语言模式对中文友好度低,容易把“MySQL 教程”匹配成“MySQL”“数据库”“入门”一堆无关结果;这时该切到 IN BOOLEAN MODE,但写法不对反而更糟。
- 中文词必须加英文双引号,否则
AGAINST('"大模型"')会被拆成单字;不加引号的AGAINST('大模型')在 ngram 下实际查的是"大模"和"模型"两个独立 token - 避免滥用
+:写AGAINST('+人工智能 +应用')看似严格,实则只要任一词未命中(比如“应用”被当停用词过滤),整条记录就被剔除;更稳妥是AGAINST('人工智能 应用')(空格=OR),再用WHERE加其他条件过滤 - 慎用
*通配:如'AI*'会匹配 “AIOps”“AI-driven”,但 ngram 对带星号的查询不走倒排索引主路径,性能断崖下跌;高频词建议预建同义词表关联,而非依赖通配
真正难的不是建索引或写 SQL,而是理解 ngram 是按固定长度滑动切分,不是语义分词;它不管“Transformer”是不是一个词,只管切出“Tr”“ra”“an”……所以业务上强相关词对,得靠预处理补足,而不是指望 MySQL 自己懂中文。



















