myisam根本不具备中文分词能力,仅按空格、标点切分,连续汉字被当单token处理;必须显式建fulltext索引,否则match()报错1191;布尔模式需配in boolean mode,+/-才生效;ngram仅支持innodb,myisam无法使用;中文检索应换innodb+ngram或外接es/sphinx。

MyISAM全文索引根本没中文分词能力
不是“不支持”,而是压根没实现——MyISAM的分词器只认空格、制表符、换行符和标点符号,遇到连续汉字(如数据库优化)直接当一个超长token处理,切不出任何有效词元。它不会调用词典,不识别语义,也不管“南京市长江大桥”该拆成三个词还是两个词。这种机制对英文合理,对中文等于失效。
建索引漏写FULLTEXT就必然报错1191
MyISAM不会自动建全文索引,MATCH()执行前必须显式定义。常见错误:
- 建表时没加
FULLTEXT(content),后续直接MATCH(content) AGAINST('xxx')→ 报错Error 1191: Can't find FULLTEXT index matching the column list - 已有表用
ALTER TABLE t ADD FULLTEXT(content)补索引 → 过程全程锁表,大数据量时阻塞写入 - 索引建完没验证:应执行
SHOW INDEX FROM t WHERE Key_name LIKE 'ft%'确认存在
布尔模式下+ -操作符必须配IN BOOLEAN MODE
写成AGAINST('+mysql -tutorial')完全无效——MyISAM默认走自然语言模式,此时+和-只是普通字符。只有显式声明才生效:
MATCH(title) AGAINST('+数据库 +优化' IN BOOLEAN MODE)
注意:IN BOOLEAN MODE返回的是0/1布尔值,不能用于ORDER BY排序;而自然语言模式虽返回相关性分数,但对中文基本无意义,因为分词失败,分数恒为0。
ngram不是MyISAM的选项,别白折腾
MySQL的ngram解析器仅支持InnoDB引擎,MyISAM无法使用。试图在MyISAM表上加WITH PARSER ngram会直接报错。网上有些方案建议改ft_min_word_len=2或手动加空格(如存成数据 库优化),实际效果极差:
-
ft_min_word_len调小只影响英文短词过滤,对中文连续字串无切分作用 - 人工加空格破坏语义,“数据库”搜不到“数据 库优化”
- 停用词阈值(50%出现率自动过滤)和内置停用词表会导致关键词静默消失,查不到也不报错
真正能落地的中文全文检索,要么换InnoDB + ngram,要么外接Elasticsearch或Sphinx——MyISAM这条路,从底层机制上就走不通。











