1. 程式人生 > 其它 >MySQL 之全文索引

MySQL 之全文索引

 

概念

    通常數值比較、範圍過濾等就可以完成絕大多數我們需要的查詢,但是,如果希望通過關鍵字的匹配來進行查詢過濾,那麼就需要基於相似度的查詢,而不是原來的精確數值比較。全文索引就是為這種場景設計的。

    當然,用 like + % 就可以實現模糊匹配了,為什麼還要全文索引?like + % 在文字比較少時是合適的,但是對於大量的文字資料檢索,是不可想象的。全文索引在大量的資料面前,能比 like + % 快 N 倍,速度不是一個數量級,但是全文索引可能存在精度問題。

     常見的各種的搜尋引擎,雖然搜尋引擎的索引物件是超大量的資料,並且通常其背後都不是關係型資料庫,不過全文索引的基本原理是一樣的。

mysql 版本支援

   全文索引的版本、儲存引擎、資料型別的支援情況:

    1、MySQL 5.6 以前的版本,只有 MyISAM 儲存引擎支援全文索引。

    2、MySQL 5.6 及以後的版本,MyISAM 和 InnoDB 儲存引擎均支援全文索引。 

    3、只有欄位的資料型別為 char、varchar、text 及其系列才可以建全文索引。

總之,

  MySQL 的全文索引最開始僅支援英語,因為英語的詞與詞之間有空格,使用空格作為分詞的分隔符是很方便的。亞洲文字,比如漢語、日語、漢語等,是沒有空格的,這就造成了一定的限制。不過 MySQL 5.7.6 開始,引入了一個 ngram 全文分析器來解決這個問題,並且對 MyISAM 和 InnoDB 引擎都有效。

  事實上,MyISAM 儲存引擎對全文索引的支援有很多的限制,例如表級別鎖對效能的影響、資料檔案的崩潰、崩潰後的恢復等,這使得 MyISAM 的全文索引對於很多的應用場景並不適合。所以,多數情況下的建議是使用別的解決方案,例如 Sphinx、Lucene 等等第三方的外掛,亦或是使用 InnoDB 儲存引擎的全文索引。

幾個注意點:
1、使用全文索引前,搞清楚版本支援情況;
2、全文索引比 like + % 快 N 倍,但是可能存在精度問題;
3、如果需要全文索引的是大量資料,建議先新增資料,再建立索引;
4、對於中文,可以使用 MySQL 5.7.6 之後的版本,或者第三方外掛。