mysql 全文搜索

由於作系統時用到了模糊查詢,涉及到了全文搜索的問題,這裏分享下經驗 sql

 咱們先定義什麼是全文搜索的難題 數據庫

作數據庫查詢時,隨着數據量的增大,性能也會隨之降低。性能

使用索引,可使查詢不至於在所有數據中遍歷,從而保證查詢速度能夠接受 就是說你有 500 萬條數據時,加 where 條件,會使數據庫去逐行對比 500 萬條數據每一行數據的值,很是耗時 加了索引後,直接就能篩選出知足 where 條件的記錄,不須要進行遍歷,使用 explain 就能夠看到 SQL 對比的條數優化

 可是在作文本的搜索時,常常要模糊查找,好比搜索 "訂單" 時,咱們但願得出 "採購訂單", "訂單出庫" 這兩條記錄 最直接的方法是在 where 裏寫 like %條件% 這個時候,分兩種狀況討論。索引

當 % 在後面時,索引可以保證遍歷的數據量是符合以關鍵字開頭的記錄的數量,這種狀況下,索引能有效減小對比的條數 而當 % 在前面時,因爲不知道怎麼縮小結果範圍,所以依然會遍歷整個表,這種狀況在索引無效 也就是說最簡單的作法是直接寫 where like 條件% 這樣固然知足不了咱們的要求,搜索 "訂單" 時,沒法獲得 "採購訂單" 的記錄 產品

這個時候就是全文搜索派上用場的地方。也就是說,全文搜索是用於在大量數據中作模糊查詢的優化方法 接下來是正題,如何作全文搜索,具體而言,如何在 MySQL 裏作全文搜索 it

 從 MySQL 5.0 後支持一種 FULLTEXT 的索引類型(innodb 在 5.6 之後支持),在須要模糊查詢的列中,創建這個索引就能夠支持全文搜索 where 條件的寫法不是 like 而是 match() ... against innodb

可是,中文的分詞與英文不一致,英文使用空格分詞,中文由語義進行分詞,所以默認狀況下全文搜索沒法在漢字裏搜索 這個時候須要手動指定一個分詞器 ngram,這個在 MySQL 5.7 中被 innodb 支持,搜索

須要這樣創建索引: ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram; 查詢時這樣寫: SELECT * FROM articales WHERE MATCH(body) AGAINST("keywords" IN BOOLEAN MODE); 遍歷

 這樣 sql explain 時就能夠看到影響的 rows 僅爲 1,證實咱們沒有進行全表的遍歷 結論: 全文搜索是在模糊查詢時進行優化的一個手段,當須要在大量數據中搜索子串時可以提升性能。

好比能夠加快搜索產品名稱中的 "硫酸脲" 的速度。不過這也是在大量數據的前提下的,若是要進行全文搜索的表不到 10 萬行,直接使用 %like% 也能夠接受。


僅此記錄他言--

相關文章
相關標籤/搜索