SELECT ... LIKE '%keyword%' 全表掃描,大數據量性能極差,且無相關性排序。
FULLTEXT 索引MATCH(col) AGAINST('keyword') 語法
CREATE TABLE reviews (
id INT(5) PRIMARY KEY AUTO_INCREMENT,
data TEXT
) ENGINE=MyISAM; # 5.6+ InnoDB 也支持
INSERT INTO reviews (data) VALUES
('Gingerboy has a new single out called Throwing Rocks. It\'s great!'),
('Hello all, I really like the new Madonna single. One of the hottest tracks...'),
('Have you heard the new band Hotter Than Hell? They have five members and burn instruments...');
ALTER TABLE reviews ADD FULLTEXT INDEX (data);
SHOW INDEXES FROM reviews;
# 顯示 Index_type = FULLTEXT
# 查找包含 "single" 的記錄
SELECT id FROM reviews WHERE MATCH(data) AGAINST('single');
# 返回 id=1,2
# 查看相關性評分
SELECT id, MATCH(data) AGAINST('rock') AS score FROM reviews;
# id=3 score=1.386,id=1,2 score=0
評分越高相關性越強,MySQL 內部基於詞頻/文檔頻率/長度歸一化計算。
# 必須包含 single,排除 madonna
SELECT id FROM reviews WHERE MATCH(data) AGAINST('+single -madonna' IN BOOLEAN MODE);
# 返回 id=1
# 通配符前綴匹配:查找以 hot 開頭的詞
SELECT id FROM reviews WHERE MATCH(data) AGAINST('hot*' IN BOOLEAN MODE);
# 返回 id=3 (Hotter), id=2 (hottest)
# OR 邏輯:至少包含 hell 或 rocks 之一
SELECT id FROM reviews WHERE MATCH(data) AGAINST('hell rocks' IN BOOLEAN MODE);
# 返回 id=1 (Rocks), id=3 (Hell)
| 操作符 | 含義 | 示例 |
|---|---|---|
+ | 必須包含 | +mysql |
- | 必須不包含 | -oracle |
* | 通配符(僅作後綴) | hot* |
"" | 短語精確匹配 | "full text" |
> < | 調整相關性權重 | >mysql |
~ | 降低貢獻值(軟排除) | ~legacy |
ft_min_word_len),中文需分詞或調整參數ft_stopword_filengram (5.7.6+) 或外部分詞器 (SCWS/jieba) + 應用層索引MySQL 全文搜索以倒排索引 + 自然語言評分 + 布爾精確控制三位一體,大幅超越 LIKE 性能與質量。中文場景需配合分詞器或 ngram 解決分詞問題。