萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 全文索引實戰:告別 LIKE '%...%' 低效掃描,擁抱 MATCH AGAINST 智能檢索

為什麼不用 LIKE?

  • 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 秒,且自帶相關性評分。

copyright © 萬盛學電腦網 all rights reserved