項目中有個日誌表,需求要對日誌內容做模糊匹配,但是考慮到數據量會比較大,用like性能不高。查了一下可以用MYSQL自帶的全文檢索,並且小測試了一下。
創建全文檢索字段,只有char、varchar、text、longtext才支持:
CREATE FULLTEXT INDEX annotation_index ON sys_quartz_log (annotation) WITH PARSER ngram;
其中 annotation 是字段名,sys_quartz_log 是表名。
查詢的話我用的默認自然語言方式:
SELECT * FROM sys_quartz_log WHERE MATCH (annotation) AGAINST ('執行語句');
BOOLEAN模式,使用操作符,可以支持指定關鍵詞必須出現或者必須不能出現或者關鍵詞的權重高還是低等複雜查詢:
SELECT * FROM sys_quartz_log WHERE MATCH (annotation) AGAINST ('執行語句' IN NATURAL LANGUAGE MODE);
測試使用like,執行時間0.065s:
使用全文檢索執行時間,0.027s。
測試針對我目前的數據量而言,大概只有兩三千數據,如果數據量更大,體現應該更明顯。