MySQL 8.0+ 默认内置 ngram 解析器,无需安装插件;建全文索引必须显式指定 WITH PARSER ngram;仅支持 INNODB/MYISAM 引擎和 utf8mb4 字符集;ngram_token_size 控制分词粒度且需重启生效;查询仅支持自然语言模式且关键词长度不得小于 token size。

MySQL 8.0+ 默认已内置 ngram,不用手动安装插件
MySQL 5.7 开始引入 ngram 全文解析器,8.0 起直接内置,无需执行 INSTALL PLUGIN 或编译安装。常见错误是翻到旧文档去搜 mysql_install_plugin 或下载第三方 so 文件——这在现代 MySQL 版本里不仅多余,还可能引发兼容性报错(比如 Plugin 'ngram' is not loaded 实际是因为配置没生效,而非插件缺失)。
确认是否可用,直接查系统变量:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'ngram';
只要返回 ACTIVE,说明解析器就绪;没结果也不代表失败——它不作为传统插件注册,而是随服务启动自动加载。
CREATE FULLTEXT INDEX 时必须显式指定 WITH PARSER ngram
即使 ngram 已就绪,建全文索引时若漏掉解析器声明,MySQL 仍会用默认的 generic 解析器(按空格/标点切词),对中文完全失效。这是最常踩的坑:建完索引、执行 MATCH ... AGAINST 却查不到任何结果,还以为是数据或编码问题。
正确写法(以中文字段为例):
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_content (title, content) WITH PARSER ngram;
-
WITH PARSER ngram必须写在语句末尾,不能省略 - 只支持
INNODB和MYISAM引擎,且表字符集推荐utf8mb4 - 不支持前缀索引(如
content(100)),必须是完整列
ngram_token_size 控制分词粒度,影响查全率和索引体积
该参数决定中文按几个字切一次词,默认为 2(即“数据库”会被切为“数据”“库”)。值设太小(如 1)会导致噪声词暴增、索引膨胀;设太大(如 4)则漏匹配短词组合,比如搜“数据”可能查不到“数据库”里的“数据”片段。
调整需重启 MySQL(动态设置无效):
SET GLOBAL ngram_token_size = 2;
但注意:
- 修改后仅对新创建的全文索引生效,已有索引需重建
- 建议先在测试库验证:用
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE查当前索引分词结果 - 混合中英文场景下,
ngram对英文仍按空格切,不会做字母级拆解
AGAINST 查询必须用自然语言模式,且关键词长度受 ngram_token_size 约束
MATCH ... AGAINST ('关键词' IN NATURAL LANGUAGE MODE) 是唯一支持 ngram 的模式。布尔模式(IN BOOLEAN MODE)会绕过 ngram 解析器,直接退化为默认切词逻辑。
另外,查询词长度不能小于 ngram_token_size。比如 ngram_token_size=2 时,搜单字“数”将永远无结果——这不是 bug,是设计使然。
- 搜索短词可考虑搭配
LIKE或REGEXP作为补充(但丧失全文索引性能优势) - 多词查询用空格分隔,如
AGAINST ('数据库 教程' IN NATURAL LANGUAGE MODE),不支持引号短语匹配 - 停用词表仍生效,中文常用停用词(如“的”“了”)需手动从
information_schema.innodb_ft_default_stopword中排除
真正麻烦的是跨版本迁移:低版本 MySQL 导出的全文索引,在高版本导入后不会自动适配 ngram,得手工重建。这个点容易被忽略,一上线就查不到数据。










