alter table add fulltext是最常用且安全的方式:mysql 5.6.4+的innodb表支持全文索引,但create fulltext index仅限单列,联合索引必须用alter table add fulltext(title, content),且需确保字段为varchar/text、引擎为innodb、版本≥5.6。

ALTER TABLE ADD FULLTEXT 是最常用且安全的方式
MySQL 5.6.4+ 的 InnoDB 表支持全文索引,但不能用 CREATE INDEX 为已有表直接添加联合全文索引(单列可以),ALTER TABLE ... ADD FULLTEXT 是最稳妥的选择。它会自动处理索引结构重建、事务一致性及锁行为。
- 对单列添加:
ALTER TABLE articles ADD FULLTEXT(content); - 对多列添加(联合索引):
ALTER TABLE articles ADD FULLTEXT(title, content); - 不支持在
ALTER TABLE ... ADD INDEX语句中混用FULLTEXT—— 这会报错ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes,即使引擎是 InnoDB - 执行前确保字段类型是
VARCHAR、CHAR或TEXT;INT或BLOB会直接失败
建表时写 FULLTEXT 就能省掉后续 DDL
如果表还没创建,直接在 CREATE TABLE 语句末尾声明 FULLTEXT,比后期加索引更轻量,也避免了重建全文索引时的隐式锁表和临时空间开销。
- 语法必须放在
ENGINE=InnoDB前或后,但不能嵌套在列定义里:FULLTEXT (title, content)是合法的,title VARCHAR(200) FULLTEXT是非法的 - 推荐显式指定字符集,尤其涉及中文场景:
ENGINE=InnoDB CHARACTER SET utf8mb4 - 注意:MyISAM 的
TYPE=MYISAM写法在 5.7+ 已废弃,InnoDB 表一律用ENGINE=
CREATE FULLTEXT INDEX 仅适用于单列,且有隐含限制
CREATE FULLTEXT INDEX 看似直观,但它在 InnoDB 中只允许对**单个列**创建索引,且无法用于已存在全文索引的表上再次添加同名索引(会报 ERROR 1061 (42000): Duplicate key name)。
- 可用:
CREATE FULLTEXT INDEX ft_title ON articles(title); - 不可用:
CREATE FULLTEXT INDEX ft_both ON articles(title, content);→ 报错ERROR 1214 - 若表已有
FULLTEXT索引,再执行CREATE FULLTEXT INDEX添加另一列,不会合并成联合索引,而是新建一个独立索引 - 该语句不支持
IF NOT EXISTS,需手动判断索引是否存在
容易被忽略的三个底层条件
即使语法全对,全文索引也可能“建了却查不出结果”,问题往往出在服务端配置或数据本身。
-
innodb_ft_min_token_size默认是 3(字节),英文单词 “a”、“to”、“in” 不会被索引;中文单字默认也不进索引——需改全局变量并重启 MySQL 或执行SET GLOBAL innodb_ft_min_token_size = 1(注意:修改后需重建索引才生效) -
innodb_ft_enable_stopword默认开启,停用词表里的词(如 “the”、“and”、“的”、“了”)会被跳过;设为OFF可禁用,但会增大索引体积 - 全文索引不支持前导通配符查询,
MATCH() AGAINST('数据库优化')能命中,“数据库” 和 “优化” 都出现即可;但AGAINST('库优*')在布尔模式下也无效——InnoDB 全文不支持后缀或中间匹配
SELECT VERSION();)、字段类型对、引擎是 InnoDB,再选 ALTER TABLE ... ADD FULLTEXT 上手最稳。中文搜索别指望原生支持,5.6 本质是按空白/标点切分,单字、词序、歧义都得靠应用层预处理或升级到 5.7+ 用 ngram。











