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 建索引,整个改造半小时就能完成。