mysql全文索引搜中文必须四者齐备:innodb/myisam引擎、fulltext索引显式创建(含with parser ngram)、match against语法查询、ngram_token_size配置生效,缺一不可。

MySQL全文索引不是“开了就能搜中文”,必须确认引擎、建索引方式、查询语法和中文分词四者全部到位,缺一不可。
确认表引擎是否支持 FULLTEXT
执行 SHOW CREATE TABLE your_table_name 查看当前引擎。只有 InnoDB 和 MyISAM 支持全文索引;如果显示 MEMORY、ARCHIVE 或 CSV,直接执行 ALTER TABLE your_table_name ENGINE = InnoDB 转换。否则加索引会报错:ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes。
添加全文索引的两种合法写法
对已存在表,只能用 ALTER TABLE ... ADD FULLTEXT(InnoDB 不支持 CREATE INDEX ... FULLTEXT 单独添加):
- 单列索引:
ALTER TABLE articles ADD FULLTEXT(content) - 多列联合索引:
ALTER TABLE articles ADD FULLTEXT(title, content)—— 必须一次性写全,之后不能再单独为content新增一个全文索引 - 建表时定义更稳妥:
CREATE TABLE articles (... FULLTEXT(title, content)) ENGINE=InnoDB
注意:大表加索引会重建并阻塞写入,生产环境务必避开高峰。
必须用 MATCH AGAINST,LIKE 和 REGEXP 不走索引
以下写法完全无效(哪怕字段有全文索引):
WHERE content LIKE '%数据库%'WHERE content REGEXP 'MySQL|PostgreSQL'
正确写法只有一种:MATCH(col1, col2) AGAINST(...),且需注意模式:
- 自然语言模式(默认):
AGAINST('数据库优化' IN NATURAL LANGUAGE MODE)—— 返回按相关性排序的结果 - 布尔模式(推荐控制逻辑):
AGAINST('+数据库 -性能' IN BOOLEAN MODE),其中+表示必须含、-表示必须不含 - 搜索词长度低于
ft_min_word_len(默认 4)会被忽略,如搜'PHP'返回空 —— 需改配置、重启 MySQL、重建索引
ngram 是中文全文检索唯一可行方案
MySQL 原生按空格/标点切词,中文无空格 → 整个字段被当做一个超长“词”,索引后几乎无法命中。强行设 ft_min_word_len=1 无效。
真正能用的只有 ngram 插件(MySQL 5.7.6+ 内置):
- 在
my.cnf中添加:ngram_token_size=2(中文二元分词,也可设 3) - 重启 MySQL
- 建表或改表时指定解析器:
FULLTEXT(title, content) WITH PARSER ngram - 已有表需先删旧索引再重建:
DROP INDEX ft_idx ON articles; ALTER TABLE articles ADD FULLTEXT(title, content) WITH PARSER ngram
没配 ngram 就搜中文,MATCH AGAINST 基本等于摆设 —— 这点最容易被跳过,但恰恰是成败关键。











