mysql 5.6+ innodb全文索引需满足版本≥5.6.4、engine=innodb、字段为char/varchar/text、显式创建fulltext索引且用match() against()查询,中文需ngram插件支持。

MySQL 5.6 的 InnoDB 全文本搜索功能默认可用,但必须满足几个硬性条件——版本达标、字段类型合规、索引显式创建、查询语法正确。不满足任一条件都会导致 MATCH() AGAINST() 报错或返回空结果。
确认 MySQL 版本与存储引擎
5.6.4 是关键分界点:早于该子版本的 5.6.x 不支持 InnoDB 全文索引。执行以下命令验证:
SELECT VERSION();
输出如 5.6.38 或更高即合格;若为 5.6.32,需升级。同时确认表使用 InnoDB 引擎:
SHOW CREATE TABLE articles;
结果中必须含 ENGINE=InnoDB。MyISAM 表虽也支持全文索引,但事务安全性和外键约束不可兼得。
创建 FULLTEXT 索引的两种方式
全文索引不能通过普通 CREATE INDEX 添加,必须用 FULLTEXT 关键字声明:
- 建表时直接定义(推荐):
CREATE TABLE articles ( id INT PRIMARY KEY, title VARCHAR(200), content TEXT, FULLTEXT (title, content) ) ENGINE=InnoDB;
- 对已有表添加:
ALTER TABLE articles ADD FULLTEXT(title, content);
注意:该操作会锁表,大表需避开业务高峰。
单列索引写法:ADD FULLTEXT(content);多列联合索引必须全部列在括号内,顺序不影响查询效果。
必须用 MATCH() AGAINST(),不能用 WHERE + LIKE
全文索引生效的前提是使用专用语法,任何尝试用 WHERE content LIKE '%数据库%' 的写法都绕过索引,退化为全表扫描。
自然语言模式(默认):
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('数据库优化');
布尔模式(支持逻辑操作符):
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('+MySQL -性能' IN BOOLEAN MODE);
常见错误现象:
-
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list:列名拼错、大小写不一致、或未在索引中包含所有MATCH()中列出的列 - 返回空结果但无报错:可能因词长不足(默认最小 4 字符)、被停用词过滤(如“的”“和”),或字段值为空/全是空白符
中文搜索在 5.6 中基本不可行
MySQL 5.6 的 InnoDB 全文索引完全依赖空格与标点分词,对中文无效。输入“数据库”会被当作一个整体,但索引中实际未切分,且默认 innodb_ft_min_token_size=3,而汉字单字长度为 1,无法命中。
强行使用会导致:
- 所有中文词都不被收录(因长度
- 即使调大
innodb_ft_min_token_size,也无法解决无空格分词问题 - 启用
innodb_ft_enable_stopword=OFF仅影响停用词,不解决分词机制缺陷
所以,如果你的字段存的是中文,5.6 下不要指望原生全文索引能工作。要么升级到 5.7+ 并启用 ngram 插件,要么引入 CoreSeek/Sphinx 等外部方案——这是最容易被忽略、却最致命的一点。











