MySQL 全文索引实战:中文搜索从 LIKE 到 ngram 的性能飞跃

发布于 2026-07-16 05:51 1487 阅读 更新于 2026-07-19

很多 PHP 项目的站内搜索都是一条 LIKE '%关键词%' 走天下。数据量小的时候没问题,一旦文章表超过十万行,每次搜索都是全表扫描,页面卡到怀疑人生。

一、LIKE 为什么慢

前置百分号的 LIKE 查询无法使用 B+Tree 索引,MySQL 只能逐行读取并匹配。10 万行的表每次搜索都要扫描全部数据页,QPS 稍高数据库就被拖垮。

二、ngram 全文索引方案

MySQL 5.7.6 之后内置了 ngram 分词器,专门解决中日韩文本的分词问题:

ALTER TABLE articles ADD FULLTEXT INDEX ft_search (title, content) WITH PARSER ngram;

SELECT * FROM articles WHERE MATCH(title, content) AGAINST('百度收录' IN NATURAL LANGUAGE MODE);

ngram 默认按 2 字切词,中文短语会被拆成连续的二字组合建立倒排索引,查询时直接命中索引,百万级数据毫秒返回。

三、Laravel 中的用法

Laravel 提供了 whereFullText 方法,一行代码即可切换到全文索引查询,配合迁移文件里的原生 SQL 建索引,整个改造半小时就能完成。