【高频面试题】FullText 全文索引(MySQL)

发布时间:2026/10/5 4:45:38
【高频面试题】FullText 全文索引(MySQL) 普通索引匹配完整字段值like %关键词%不走索引扫描全表全文索引 FULLTEXT专门用来在长文本文章、标题、内容中搜索单词 / 短语分词检索支持语义相关度排序。1. 基础概念适用引擎InnoDBMySQL5.6 支持、MyISAM支持字段类型CHAR、VARCHAR、TEXT原理把文本拆分成单词token建立单词 → 文档 ID 的倒排索引搜索时按单词匹配计算相关性分数。默认分词规则英文按空格、标点分割中文默认不支持分词需要插件ngram 分词器。两个重要系统参数innodb_ft_min_token_sizeInnoDB 最小单词长度默认3。 小于 3 个字符的词不会被收录。ft_stopword_file停用词列表a,the,is中文的 “的、了”停用词不会进索引。⚠️ 中文坑原生全文索引不切中文词语连续汉字当成一个字符串。MySQL 提供ngram分词插件按固定 N 元组切分中文。2. 创建全文索引建表时创建CREATE TABLE article ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200), content TEXT, FULLTEXT INDEX ft_article(title, content) -- 多字段联合全文索引 ) ENGINEInnoDB;已有表添加索引ALTER TABLE article ADD FULLTEXT INDEX ft_article(title,content);删除全文索引ALTER TABLE article DROP INDEX ft_article;3. 查询语法MATCH() AGAINST()语法MATCH(字段1,字段2) AGAINST (搜索词 [搜索模式])MATCH 指定要检索哪些字段AGAINST 指定搜什么词以及用哪种搜索规则。返回值相关性分数分数越高代表匹配度越高。3 种搜索模式① 自然语言模式默认IN NATURAL LANGUAGE MODE查找包含关键词的行按相关性降序不支持运算符。SELECT id,title, MATCH(title,content) AGAINST (java IN NATURAL LANGUAGE MODE) AS score FROM article WHERE MATCH(title,content) AGAINST (java);规则词出现频率太高超过 50% 文档会被当成停用词搜不到最小词长限制生效。② 布尔模式IN BOOLEAN MODE支持 - * 短语运算符不计算相关性排序只判定是否匹配。符号含义java必须包含 java-mysql不能包含 mysqljava*前缀匹配java 开头单词 (java,javac)hello world精确短语连续完整词组word提高该词相关性word降低该词相关性示例必须有 java不能有 springSELECT * FROM article WHERE MATCH(title,content) AGAINST (java -spring IN BOOLEAN MODE);③ 查询扩展模式WITH QUERY EXPANSION先根据关键词找到相关文档再提取文档里高频词做二次搜索适合概念扩展容易引入无关数据。MATCH(title,content) AGAINST (数据库 WITH QUERY EXPANSION);4. 中文使用ngram 分词器ngram把中文按 N 个字符滑动切分ngram_token_size一般设 2二元分词。建表指定 ngram 解析器CREATE TABLE news( id INT PRIMARY KEY AUTO_INCREMENT, content TEXT, FULLTEXT INDEX ft_news(content) WITH PARSER ngram ) ENGINEInnoDB;注意ngram_token_size2最小搜索长度是 2不能搜单个汉字。查询示例SELECT * FROM news WHERE MATCH(content) AGAINST (深圳 IN NATURAL LANGUAGE MODE);5. 全文索引优缺点✅ 优点相比like %xxx%全表扫描全文索引检索速度快很多自带相关性打分适合文章搜索场景支持布尔语法、短语匹配。❌ 缺点有最小词长限制太短的词无法检索高频词超过半数文档存在在自然语言模式会被忽略中文原生不支持语义分词ngram 会产生大量碎词索引体积大DML 开销大新增 / 修改文本需要维护倒排索引写入性能下降不支持部分场景不能用于ORDER BY以外复杂排序不适合短字段精确匹配。6. 什么时候不要用 MySQL FullText大量中文搜索、需要分词人名、专有名词、高亮、分页权重、同义词 → 推荐 Elasticsearch / Solr只是简单模糊匹配短字符串 → 普通 B 树索引 like xxx%前缀匹配7. 常见踩坑MATCH的字段列表必须和建立全文索引的字段完全一致否则报错自然语言模式下如果关键词在超过一半数据里存在查不出结果ngram 分词 token_size 一旦设置不能在线修改需要重建索引AGAINST里不要直接拼接用户输入防止注入。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询