使用 LIKE '%關鍵字%' 進行全文搜尋雖然直觀,但存在嚴重效能缺陷:無法利用索引、全表掃描、大數據量下回應極慢。MySQL 全文索引專為解決此問題而設計,透過倒排索引結構實現毫秒級檢索。
ALTER TABLE 文章表 ADD FULLTEXT INDEX idx_content (內容欄位);
支援單欄或多欄組合索引:FULLTEXT INDEX idx_title_content (標題, 內容)。
SHOW INDEXES FROM 文章表 WHERE Index_type = 'FULLTEXT';
SELECT 標題, 內容, MATCH(內容) AGAINST('資料庫優化') AS 相關度
FROM 文章表
WHERE MATCH(內容) AGAINST('資料庫優化')
ORDER BY 相關度 DESC;
特點:自動計算相關度、忽略停用詞、支援隱含邏輯邏輯。
SELECT * FROM 文章表
WHERE MATCH(內容) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
+ 必須包含- 必須排除* 萬用字元(僅限詞尾)"phrase" 精確短語匹配SELECT * FROM 文章表
WHERE MATCH(內容) AGAINST('資料庫' WITH QUERY EXPANSION);
先執行自然語言搜尋,再用高相關度文檔中的關鍵字進行二次搜尋,適合發現潛在相關內容。
ft_min_word_len (MyISAM) / innodb_ft_min_token_size (InnoDB),預設 4,中文建議設為 1 或 2。ft_stopword_file。ngram 解析器 (MySQL 5.7.6+) 或外部分詞工具。SELECT * 造成大量 I/O。WHERE MATCH(...) AGAINST(...) LIMIT 20 OFFSET 1000 時,偏移量大會變慢,改用游標式分頁(記住上一頁最大相關度/主鍵)。OPTIMIZE TABLE 整理碎片。Innodb_ft_index_cache_size、Innodb_ft_total_cache_size 等狀態變數。| 場景 | 推薦方案 |
|---|---|
| 部落格/文章/產品描述搜尋 | 全文索引 + 自然語言模式 |
| 後台管理精確篩選 | 布林模式 + 組合索引 |
| 推薦系統/相關內容發現 | 查詢擴展模式 |
| 短字串/標籤/代碼搜尋 | B-Tree 索引 + LIKE / = |
正確使用 MySQL 全文索引,能將搜尋效能提升數十倍,並提供語意相關度排序,是構建高質量搜尋功能的關鍵基礎設施。