SELECT * FROM articles WHERE body LIKE '%keyword%' 在大表上會觸發全表掃描,效能隨資料量線性惡化,且無法按相關度排序。MySQL FULLTEXT 索引 專為此場景設計:建立倒排索引、支援自然語言相關度評分、布林邏輯查詢。
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title, body)
) ENGINE=MyISAM; -- 5.6+ InnoDB 亦支援
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_body (title, body);
SHOW INDEXES FROM articles WHERE Index_type = 'FULLTEXT';
SELECT title, body
FROM articles
WHERE MATCH(title, body) AGAINST('search keywords');
SELECT id, title,
MATCH(title, body) AGAINST('MySQL tutorial') AS relevance
FROM articles
WHERE MATCH(title, body) AGAINST('MySQL tutorial');
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+MySQL -deprecated' IN BOOLEAN MODE);
ORDER BY)+ - > < () ~ * "..." 運算子MATCH() 欄位必須完全匹配某個 FULLTEXT 索引的欄位組合(布林模式除外)。AGAINST() 參數必須為常數字串,不可用變數或欄位。ft_min_word_len 預設 4,中文需配合分詞器或調為 2。ft_stopword_file 可自訂。-- 修改最小詞長(需重建索引)
SET GLOBAL ft_min_word_len=2;
-- 自訂停用詞表
SET GLOBAL ft_stopword_file='/etc/mysql/stopwords.txt';
對於中小型專案、單機部署、維運資源有限的場景,MySQL 內建全文搜尋是「零依賴、零成本」的優質選擇。善用 FULLTEXT 索引 + MATCH...AGAINST,即可以 SQL 原生語法實現相關度排序、布林邏輯與片語搜尋,大幅提升使用者搜尋體驗。