LIKE '%keyword%' 不走索引,全表掃描,數據量大時極慢-- 建表時
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT KEY ft_title_body (title, body)
) ENGINE=InnoDB; -- 5.6+ InnoDB 支持全文索引
-- 或後加索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_body (title, body);
驗證:SHOW INDEXES FROM articles; 看到 Index_type: FULLTEXT
SELECT id, title, MATCH(title, body) AGAINST('MySQL 優化') AS relevance
FROM articles
WHERE MATCH(title, body) AGAINST('MySQL 優化')
ORDER BY relevance DESC;
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+MySQL -舊版' IN BOOLEAN MODE);
-- + 必須包含,- 必須不包含,* 通配符
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('數據庫調優' WITH QUERY EXPANSION);
| 項目 | 說明 |
|---|---|
| 最小詞長 | ft_min_word_len=4(默認),中文需設置為 1 或使用 ngram 解析器 |
| 停用詞 | 內置停用詞表,可通過 ft_stopword_file 自定義 |
| 中文支持 | 5.7+ 內置 ngram 解析器,FULLTEXT INDEX ... WITH PARSER ngram |
| 結果限制 | 默認返回前 50% 相關行,布爾模式無此限制 |
CREATE TABLE docs (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
content TEXT,
FULLTEXT KEY ft_content (content) WITH PARSER ngram
) ENGINE=InnoDB;
-- 查詢
SELECT * FROM docs WHERE MATCH(content) AGAINST('數據庫優化' IN BOOLEAN MODE);
百萬級數據:LIKE '%關鍵詞%' > 10 秒 vs MATCH AGAINST < 0.1 秒,且自帶相關性評分。