由於作系統時用到了模糊查詢,涉及到了全文搜索的問題,這裏分享下經驗 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% 也能夠接受。
僅此記錄他言--