首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 全文搜尋效能優化實戰:FULLTEXT 索引建立、自然語言模式與布林模式完整指南

     編輯:MySQL 資料庫相關知識

為什麼不直接用 LIKE?

SELECT * FROM articles WHERE content LIKE '%keyword%':

  • 無法使用索引 → 全表掃描。
  • 大量資料極慢,無相關性排序。
  • 不支援詞幹、同義詞、鄰近度搜尋。

FULLTEXT 索引原理

  • 建立倒排索引:詞項 → 文件 ID 映射,儲存詞頻、位置資訊。
  • 支援自然語言模式(預設):計算相關性分數,依分數降序排序。
  • 支援布林模式:+ 必含、- 必不含、* 萬用字元、"" 精確片語、>/< 權重調整。
  • MySQL 5.6+ InnoDB 支援 FULLTEXT(舊版僅 MyISAM)。

實戰建立步驟

-- 1. 建立範例表
CREATE TABLE reviews (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    content TEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 2. 插入測試資料
INSERT INTO reviews (content) 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 currently playing...'),
('Have you heard the new band Hotter Than Hell? They have five members and they burn their instruments when they play in concerts.');

-- 3. 建立 FULLTEXT 索引
ALTER TABLE reviews ADD FULLTEXT INDEX ft_content (content);

-- 4. 驗證索引
SHOW INDEX FROM reviews WHERE Key_name = 'ft_content';

自然語言模式查詢(預設)

SELECT id, content,
       MATCH(content) AGAINST('new single' IN NATURAL LANGUAGE MODE) AS relevance
FROM reviews
WHERE MATCH(content) AGAINST('new single' IN NATURAL LANGUAGE MODE)
ORDER BY relevance DESC;
  • 自動忽略停用詞(stopwords:the, and, is...)。
  • 50% 門檻:若搜尋詞出現在超過 50% 文件中,視為常見詞自動忽略(僅自然語言模式)。
  • 最小詞長:預設 4 字元(ft_min_word_len),可調整需重建索引。

布林模式查詢(精準控制)

-- 必須包含 new,必須包含 single,排除 Madonna
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('+new +single -Madonna' IN BOOLEAN MODE);

-- 精確片語搜尋
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('"Throwing Rocks"' IN BOOLEAN MODE);

-- 萬用字元(詞幹搜尋)
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('play*' IN BOOLEAN MODE);
-- 匹配 play, playing, played...

-- 權重調整
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('>new 

效能優化關鍵

  1. 字元集一致:表、欄位、連線字元集皆為 utf8mb4,避免分詞錯誤。
  2. 停用詞表自訂:ft_stopword_file = /etc/mysql/stopwords.txt,業務專有名詞勿被過濾。
  3. 最小詞長調整:中文環境建議 ft_min_word_len = 1 或 2,配合 ngram 解析器(MySQL 5.7.6+)。
  4. 中文分詞:MySQL 內建不支援中文分詞,生產環境建議外接 Elasticsearch、Meilisearch 或使用 ngram 解析器(WITH PARSER ngram)。
  5. 大量寫入時延遲建立索引:先匯入資料,再 ALTER TABLE ... ADD FULLTEXT INDEX,避免逐筆維護索引開銷。

查詢效能驗證

EXPLAIN SELECT * FROM reviews
WHERE MATCH(content) AGAINST('+new +single' IN BOOLEAN MODE);
-- type=fulltext, key=ft_content, rows=1 (理想)

避坑指南

  • MATCH() AGAINST() 在 WHERE 與 SELECT 列表中參數必須完全一致,才能複用索引計算。
  • IN NATURAL LANGUAGE MODE 不支援 +/- 操作符。
  • 資料量極大(億級)時,MySQL FULLTEXT 效能有限,建議遷移專業搜尋引擎。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved