傳統 LIKE '%關鍵詞%' 在大數據量下性能災難級:
-- 1. 建表時指定(推薦)
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT KEY ft_title_content (title, content)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- 2. 或後續添加
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_content (title, content);
-- 3. 驗證索引生效
SHOW INDEX FROM articles WHERE Key_name = 'ft_title_content';
SELECT id, title,
MATCH(title, content) AGAINST('MySQL 優化') AS relevance
FROM articles
WHERE MATCH(title, content) AGAINST('MySQL 優化')
ORDER BY relevance DESC;
-- 必須包含 MySQL,排除入門,優化權重提高
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('+MySQL -入門 優化*' IN BOOLEAN MODE);
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('數據庫調優' WITH QUERY EXPANSION);
| 參數 | 默認值 | 建議調整 | 說明 |
|---|---|---|---|
| ft_min_word_len | 4 | 1-2 (中文) | 最小索引詞長度,中文需配合分詞器 |
| ft_stopword_file | 內置列表 | 自定義/空 | 停用詞表,中文場景建議置空 |
| innodb_ft_min_token_size | 3 | 1-2 | InnoDB 全文索引同類參數 |
注意:修改參數需重建索引 REPAIR TABLE tbl QUICK 或 ALTER TABLE tbl DROP INDEX ..., ADD FULLTEXT INDEX ...
MySQL 內置分詞器對中文支持弱,生產環境建議:
keywords 字段建索引mysql-jieba、ngram parser (MySQL 5.7.6+)OPTIMIZE TABLEft_min_word_len 導致短詞搜不到EXPLAIN 確認 type=fulltextHandler_read_key 指標評估索引命中率MySQL 全文搜索以 MATCH ... AGAINST 為核心,配合合理的分詞策略與參數調優,可將文本檢索效率提升 2-3 個數量級。但對於億級數據、複雜語義查詢,仍建議引入 Elasticsearch 等專業搜索引擎。