MYSQL海量文本搜索,别再使用LIKE了,全文搜索爽翻天

内容分享8小时前发布
0 1 0

还在用 LIKE 模糊查询?别傻了!面对海量文本,LIKE 不仅慢到让人抓狂(全表扫描拖垮性能),还没法精准匹配、算相关性排序。而 MySQL 全文搜索,既能 3 秒定位目标内容,又支持关键词权重、中文分词,甚至能自动拓展相关结果 —— 看完直接解决 80% 的文本检索需求!

一、先明确:支持范围(别白忙活)

  • 引擎:仅 InnoDB(5.6+) 和 MyISAM,优先选 InnoDB(支持事务 + 并发,更稳定)
  • 版本:InnoDB 用户必须升级到 5.6 及以上,旧版本没这功能
  • 字段:仅 CHAR/VARCHAR/TEXT 类型能建索引,其他字段(如 INT、DATE)用不上

二、3 步建全文索引(附现成代码)

1. 建表时加索引(推荐,一步到位)

CREATE TABLE articles (
  
  id INT AUTO_INCREMENT PRIMARY KEY,

 title VARCHAR(200) NOT NULL, -- 文章标题

 content TEXT NOT NULL, -- 文章内容

 -- 给title+content建联合全文索引,覆盖多字段检索

 FULLTEXT idx_title_content (title, content)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 必用utf8mb4,否则中文会乱码

2. 给已有表加索引(常用,补建不麻烦)

-- 给articles表的title和content字段补全文索引

ALTER TABLE articles

ADD FULLTEXT idx_title_content (title, content);

3. 避坑 3 点(新手必看,少走弯路)

  • ❌ 一张表只能建 1 个全文索引(多列可放一起,不用重复建)
  • ❌ 联合索引的所有字段,字符集必须一致(都设为 utf8mb4)
  • ❌ 别给短字段建索引(如仅 10 字符的 “标签” 字段,没必要浪费资源)

三、3 种查询模式(覆盖所有场景,按需选)

1. 自然语言模式(日常用最多,简单直观)

默认模式,自动计算关键词相关性,结果按匹配度排序,像百度搜内容一样简单:

-- 搜包含“MySQL优化”的文章,相关度高的排前面

SELECT id, title, content

FROM articles

WHERE MATCH(title, content) AGAINST('MySQL优化');

2. 布尔模式(精准筛选,复杂需求必用)

支持 +/-/* 符号,能精准控制 “必须包含”“必须排除” 的内容:

符号

作用

例子

+

必须包含这个词

+MySQL 优化(结果必含 MySQL)

必须排除这个词

MySQL – 入门(含 MySQL 但不含入门)

*

通配符(匹配词开头)

MySQL*(匹配 MySQL、MySQL8、MySQL 优化)

-- 需求:必须有“MySQL”,排除“入门”,可含“优化”

SELECT * FROM articles

WHERE MATCH(title, content)

AGAINST('+MySQL -入门 优化' IN BOOLEAN MODE);

3. 查询扩展模式(挖隐藏内容,做相关推荐)

只给 1 个关键词,自动拓展关联内容,适合 “相关推荐” 场景(如电商商品联想):

-- 搜“MySQL”,自动带出“数据库”“SQL”“索引优化”相关文章

SELECT * FROM articles

WHERE MATCH(title, content)

AGAINST('MySQL' WITH QUERY EXPANSION);

四、中文搜索:ngram 插件轻松搞定

MySQL 默认不支持中文分词(会把 “数据库优化” 拆成单个字,搜不准),装个 ngram 插件就能解决:

1. 开启 ngram(2 步完成)

-- 1. 安装插件(重启MySQL后生效)

INSTALL PLUGIN ngram SONAME 'ha_ngram.so';

-- 2. 配置分词长度(my.cnf文件加这句话,重启生效)

ngram_token_size = 2 -- 按2字切分(例:“数据库优化”→“数据库”“优化”)

2. 建中文索引 + 查询(和英文用法差不多)

-- 给content字段建中文全文索引,指定ngram解析器

ALTER TABLE articles ADD FULLTEXT idx_zh_content (content) WITH PARSER ngram;

-- 中文查询:搜“数据库优化”相关文章

SELECT * FROM articles WHERE MATCH(content) AGAINST('数据库优化');

五、2 招优化搜索速度(不拖慢系统)

1. 低峰期重建索引(不锁表,不影响业务)

数据删改多了,索引会 “碎片化”,凌晨等低峰期重建:

ALTER TABLE articles

DROP INDEX idx_title_content,

ADD FULLTEXT idx_title_content (title, content)

ALGORITHM=INPLACE; -- 关键!加这句实现“在线重建”,不锁表

2. 用 LIMIT 减少返回数据(快到飞起)

别一次查所有结果,用 LIMIT 控制条数,大幅提升速度:

-- 只查前10条匹配结果,速度比查全表快10倍

SELECT * FROM articles WHERE MATCH(...) AGAINST(...) LIMIT 10;

注意:这些场景不适合用 MySQL 全文搜索!

虽然全文搜索好用,但不是万能的,这 3 种情况别硬用:

  1. 小数据量 + 简单匹配:列如仅 100 条数据,搜 “标题含‘测试’”,用 LIKE ‘%测试%’ 更简单,没必要建全文索引(浪费资源);
  1. 需实时更新 + 高并发:列如直播弹幕、实时聊天记录检索,MySQL 全文索引更新有延迟(即使增量更新也慢),不如用 Elasticsearch;
  1. 复杂语义理解:列如要识别 “苹果(水果)” 和 “苹果(公司)” 的区别,MySQL 没法做语义分析,得靠专门的搜索引擎(如 ES、Solr);
  1. 多语言混合检索:如果文本里又有中文、又有日文 / 韩文,MySQL 分词效果差,不如用支持多语言的第三方工具。

MYSQL海量文本搜索,别再使用LIKE了,全文搜索爽翻天

© 版权声明

相关文章

1 条评论

  • 头像
    哗仔说鱼 读者

    收藏了,感谢分享

    无记录
    回复