一、 全文索引前置條件
- 存儲引擎:MyISAM(5.6 前);InnoDB(5.6+ 支援)
- 字段類型:CHAR、VARCHAR、TEXT 及其變體
- 索引定義:
FULLTEXT(key1, key2...) 建表時或 ALTER TABLE ADD FULLTEXT 後加
- 大數據量建議:先導入數據再建索引,速度快數量級
二、 語法核心
MATCH (col1, col2, ...) AGAINST (expr [search_modifier])
search_modifier:
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
三、 三大搜索模式深度解析
1. 自然語言模式(默認)
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('database optimization');
- 將搜索詞拆分為單詞,按相關性評分排序(0~1)
- 忽略停用詞表、過短詞(默認
ft_min_word_len=4)
- 50% 閾值:若某詞出現在超過 50% 行中,視為噪聲自動忽略
- 適合:通用關鍵詞搜索、相關性排序
2. 布爾模式
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
| 操作符 | 含義 | 示例 |
+ | 必須包含(AND) | +apple +juice |
- | 必須不包含(NOT) | +apple -macintosh |
(無) | 可選,包含者權重高(OR) | apple juice |
@distance | 近度搜索(5.6+) | "word1 word2" @10 |
* | 通配符(僅尾部) | apple* |
" | 短語精確匹配 | "some words" |
- 無 50% 閾值限制
- 不按相關性排序(默認按表順序)
- 可無索引使用(全表掃描,極慢,勿用)
- 適合:精確邏輯組合、技術文檔/代碼搜索
3. 查詢擴展模式
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('database' WITH QUERY EXPANSION);
- 兩階段:先自然語言搜索 → 取前幾行高頻詞 → 二次自然語言搜索
- 能發現「間接相關」結果(如搜 "DB" 關聯出 "database"、"SQL")
- 可能引入噪聲,適合探索性搜索、推薦場景
四、 實戰案例:產品表關鍵詞搜索
表 product(name, ...),name 建全文索引,近 87 萬行。
-- 自然語言模式,1.15s 命中 10 萬+ 行
SELECT * FROM product WHERE MATCH(name) AGAINST('auto');
-- 相關性分數查看
SELECT MATCH(name) AGAINST('auto') AS relevance, name FROM product
WHERE MATCH(name) AGAINST('auto') ORDER BY relevance DESC;
五、 分詞與配置調優
- 最小詞長:
ft_min_word_len=4(my.cnf,需重建索引生效)
- 停用詞表:
ft_stopword_file 指定自定義文件,或置空禁用
- 中文分詞:MySQL 內建不支援中文分詞,需插件(如
ngram 5.7+、zhparser)或應用層分詞入庫
六、 避坑指南
| 誤區 | 正確做法 |
| 用 LIKE '%kw%' 代替全文索引 | 全文索引有倒排結構,百萬級數據毫秒級響應;LIKE 走全表掃描 |
| InnoDB 5.6 前用全文索引 | 升級 5.6+ 或遷移 MyISAM(失去事務) |
| 布爾模式期望相關性排序 | 布爾模式不排序;需應用層二次排序或用自然語言模式 |
| 搜索列非 FULLTEXT 索引列 | MATCH 列必須與 FULLTEXT 定義列完全一致(順序可不同) |
七、 總結
MySQL 全文索引提供開箱即用的文本搜索能力:自然語言模式適合通用相關性搜索,布爾模式適合精確邏輯組合,查詢擴展適合探索發現。中文場景需配合分詞插件。百萬級以內數據表現優異,超大規模建議接入 Elasticsearch 等專業搜索引擎。
- 上一篇文章: Linux 二進制包安裝 MySQL 5.6 圖文全記錄:從下載到安全配置
- 下一篇文章: MySQL 行轉列實戰:利用 SUM(IF()) 與 WITH ROLLUP 實現動態透視表
Copyright ©
程式碼之家 All Rights Reserved