MySQL的全文搜索是专门用于处理文本字段内容检索的功能,通过FULLTEXT索引对文本内容进行分词和索引,能够快速匹配包含指定关键词的记录,相比LIKE '%关键词%'的全表扫描模式,性能有显著提升,适合文章、评论、商品描述等文本类数据的检索场景。
全文搜索的基础配置
MySQL的MyISAM和InnoDB存储引擎都支持全文搜索,不过不同版本的支持范围有区别,MySQL 5.6及以上版本的InnoDB引擎才完整支持全文搜索。首先需要确认数据库的默认存储引擎,同时全文搜索有最小分词长度的限制,默认是4个字符,也就是长度小于4的词不会被索引,这个参数可以通过修改配置文件调整。
查看当前最小分词长度的命令如下:
-- 查看全文搜索最小分词长度 SHOW VARIABLES LIKE 'ft_min_word_len'; -- 查看InnoDB引擎的全文搜索相关配置 SHOW VARIABLES LIKE 'innodb_ft%';
创建FULLTEXT索引
使用全文搜索的前提是给目标文本字段创建FULLTEXT索引,支持单个字段索引,也支持多个字段的组合索引。创建索引的语法和普通索引类似,只是指定索引类型为FULLTEXT。
首先创建测试表:
-- 创建文章表,包含标题和内容两个文本字段
CREATE TABLE article (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
给title和content字段创建组合FULLTEXT索引:
-- 创建全文索引,覆盖title和content字段 ALTER TABLE article ADD FULLTEXT INDEX ft_idx_title_content (title, content); -- 也可以通过创建表的时候直接指定 -- CREATE TABLE article ( -- id INT PRIMARY KEY AUTO_INCREMENT, -- title VARCHAR(200) NOT NULL, -- content TEXT NOT NULL, -- create_time DATETIME DEFAULT CURRENT_TIMESTAMP, -- FULLTEXT INDEX ft_idx_title_content (title, content) -- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
常用的全文搜索语法
创建好索引之后,就可以使用MATCH() AGAINST()语法进行全文搜索,MATCH后面跟要建立索引的字段,AGAINST后面跟搜索的关键词。
基础全文搜索
查询标题或者内容中包含MySQL关键词的文章:
-- 基础全文搜索,匹配title或content中包含MySQL的记录
SELECT id, title, content
FROM article
WHERE MATCH(title, content) AGAINST('MySQL');
布尔模式搜索
如果需要更精准的搜索控制,可以使用布尔模式,支持的逻辑运算符包括:+表示必须包含,-表示必须不包含,*表示通配符,空格表示或关系。
例如查询必须包含MySQL,且不包含Oracle,同时包含索引或者优化的文章:
-- 布尔模式全文搜索
SELECT id, title, content
FROM article
WHERE MATCH(title, content) AGAINST('+MySQL -Oracle (索引 优化)' IN BOOLEAN MODE);
相关性排序
全文搜索默认会返回匹配的相关性得分,得分越高表示匹配度越高,可以按照得分降序排列,让最相关的结果排在前面。
-- 返回相关性得分,并按得分降序排列
SELECT id, title, content,
MATCH(title, content) AGAINST('MySQL 全文搜索' IN BOOLEAN MODE) AS score
FROM article
WHERE MATCH(title, content) AGAINST('MySQL 全文搜索' IN BOOLEAN MODE)
ORDER BY score DESC;
中文全文搜索的适配
MySQL默认的全文分词是按照空格和标点来拆分英文单词,对中文的支持不好,中文句子没有空格分隔,默认会把整个句子当成一个词,导致搜索不准确。如果需要支持中文全文搜索,可以使用MySQL的ngram全文解析器,它会按照指定的长度对文本进行切分,比如设置ngram_token_size为2,就会把中文文本按2个字一组拆分。
创建支持中文的FULLTEXT索引示例:
-- 先设置ngram解析器,创建支持中文的全文索引 ALTER TABLE article ADD FULLTEXT INDEX ft_idx_title_content_cn (title, content) WITH PARSER ngram; -- 查看ngram相关配置 SHOW VARIABLES LIKE 'ngram_token_size';
使用ngram解析器后,搜索中文关键词就能正常匹配到对应的内容了。
注意事项
- 全文搜索只适合文本类型的字段,比如CHAR、VARCHAR、TEXT类型,不支持数值、日期等类型。
- 修改了ft_min_word_len或者ngram_token_size参数之后,需要重建FULLTEXT索引才能生效。
- 数据量比较小的时候,全文搜索的优势不明显,当文本数据超过十万级的时候,性能优势会比较突出。
- 布尔模式下通配符*只能放在关键词的末尾,不能放在开头。
MySQL全文搜索FULLTEXT索引修改时间:2026-06-11 13:54:21