首页/数据/SQL 速查/全文索引与 MATCH AGAINST
性能与执行计划72 条

全文索引与 MATCH AGAINST

按词做文本检索:MySQL 的 FULLTEXT(InnoDB 支持)与 PostgreSQL 的 tsvector + GIN 都能避开前置通配的全扫描。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_content (title, content);

SELECT id, title
FROM articles
WHERE MATCH(title, content) AGAINST('+mysql -oracle' IN BOOLEAN MODE);

PostgreSQL

PostgreSQL
ALTER TABLE articles ADD COLUMN tsv tsvector
  GENERATED ALWAYS AS (to_tsvector('simple', title || ' ' || content)) STORED;
CREATE INDEX idx_articles_tsv ON articles USING GIN (tsv);

SELECT id, title FROM articles
WHERE tsv @@ plainto_tsquery('simple', 'mysql');
分词MySQL 默认按空格分词,中文可配 ngram 解析器;PG 用文本搜索配置(simple/english 等)
最小词长MySQL InnoDB 默认 innodb_ft_min_token_size=3,短词不入索引
命中模式布尔模式支持 +/- 操作符;自然语言模式按相关度排序

易错点

  • 查询低于最小词长的词:默认配置下 2 字符词不进入 FULLTEXT 索引,结果为空
  • 把全文索引当模糊匹配的替代:分词规则决定命中效果,中文场景先确认解析器配置

数据来源与参考

  • MySQL 8.0 Reference Manual · Full-Text Search Functions
  • PostgreSQL Documentation · Full Text Search
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌