使用 LIKE '%關鍵字%' 進行全文搜尋是效能殺手:無法使用索引、全表掃描、不支援相關性排序。MySQL FULLTEXT 索引 專為全文檢索設計,提供自然語言相關性評分、布林模式精確控制、極速查詢體驗。
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200),
content TEXT,
FULLTEXT INDEX ft_title_content (title, content)
) ENGINE=InnoDB;
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (content);
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (content) WITH PARSER ngram;
SHOW INDEXES FROM articles WHERE Index_type = 'FULLTEXT';
SELECT title, content,
MATCH (title, content) AGAINST ('MySQL 優化') AS relevance
FROM articles
WHERE MATCH (title, content) AGAINST ('MySQL 優化')
ORDER BY relevance DESC;
SELECT * FROM articles
WHERE MATCH (title, content) AGAINST ('+MySQL -Oracle 優化*' IN BOOLEAN MODE);
| 操作符 | 含義 | 範例 |
|---|---|---|
+ | 必須包含 | +MySQL |
- | 必須不包含 | -Oracle |
* | 萬用字元 (僅尾部) | 優化* 匹配 優化、優化方案 |
" " | 精確片語 | "全文搜尋" |
~ | 降低相關性 | ~教學 降低包含「教學」的權重 |
SELECT * FROM articles
WHERE MATCH (title, content) AGAINST ('資料庫' WITH QUERY EXPANSION);
兩階段:先自然語言搜尋 → 分析高相關文檔提取特徵詞 → 再次搜尋。適合查詢詞過短場景。
CREATE TABLE docs (
id INT PRIMARY KEY,
content TEXT,
FULLTEXT INDEX ft_content (content) WITH PARSER ngram
) ENGINE=InnoDB;
-- ngram 預設 token 長度 2 (bigram),可調整
SET GLOBAL ngram_token_size = 2; -- 需重啟生效
MeCab 插件 (需編譯安裝)| 參數 | 建議值 | 說明 |
|---|---|---|
innodb_ft_min_token_size | 2 (中文) | 最小索引詞長度,預設 3 導致中文單字不入索引 |
innodb_ft_max_token_size | 84 | 最大詞長 |
innodb_ft_enable_stopword | OFF | 中文停用詞表通常不適用,建議關閉 |
ft_min_word_len (MyISAM) | 2 | MyISAM 引擎對應參數 |
SET GLOBAL innodb_ft_enable_diag_print=ON 批次更新MySQL FULLTEXT 索引是關係型資料庫內建全文檢索的最佳選擇:零外部依賴、支援中文 (ngram)、語法豐富、效能優異。適用於 CMS 文章搜尋、電商商品搜尋、日誌關鍵字檢索等場景。資料量超億級或需極致分詞精度時,再考慮 Elasticsearch 等專用搜尋引擎。