MySQL--全文索引作用、原理及使用注意


作用

  MySQL索引可以分為:主鍵索引、普通索引、唯一索引、全文索引。其中,全文索引應該是是比較特殊的,它只有少數的幾個存儲引擎支持,且只有類型為char、vchar、text的列能建立全文索引。以前,只有MyISAM引擎支持全文索引,現在InnoDB也可以用了。

  一般情況,對於模糊查詢的情況最容易想到的就是 where  ... like %_... 這樣。確實,like 關鍵字在大都數情況下都能完成需求,但是在列的內容十分大的時候,like的性能就不能令人滿意了,因為這個關鍵字並沒有保證每次查詢都能用上索引。因此,全文索引就派上用場。除了性能上的提高,全文索引提供了更靈活的服務,比如:

  1. like 只是進行模式匹配,全文索引卻提供了一些語法語義的查詢功能,會將要查的字符串進行分詞操作,這決定於MySQL的詞庫。

  2. 全文索引可以自己設置詞語的最小、最大長度,要忽略的詞,這些都是可以設置的。

  3. 用全文索引去某個列查一個字符串,會返回匹配度,可以理解為匹配的關鍵字個數,是個浮點數。

總之就是,全文索引因為用上了索引,性能更高,有詞庫支撐可以進行分詞提供了一些語義查詢的功能,有詞語停用表忽略某些詞語,有詞語最大最小值可以設置等更靈活。

 

原理

  全文索引的對象是一個“全文集合”,如果對表的多個列建立全文索引,MySQL就會將這幾列拼接成一個字符串,然后進行索引。全文索引實際上也是B+ Tree結構,不過比較特殊,它一共有兩層,第一層是所有的關鍵字,第二層則是每個關鍵字的一組指文檔針,例如 “X” ->行1,行2,行3......。通俗解釋全文索引結構就是:它是以關鍵字去找文檔(行),而不是像其他一些索引以行主鍵來找其他列的內容。要使用全文索引,關於它的幾個參數的意義一定要清楚,控制全文索引的參數都是以 ft 開頭的(FullText)。查看這些參數以及它們的意義:

show variables like 'ft%'

ft_boolean_syntax:表示布爾查詢時的可以用的符號。改變IN BOOLEAN MODE的查詢字符,不用重新啟動MySQL也不用重建索引

ft_max_word_len :  最長的索引字符串,默認值為84,修改后要重建索引

ft_min_word_len   : 最短的索引字符串,默認值為4,修改后要重建索引

ft_query_expansion_limit:  查詢括展時取最相關的幾個值用作二次查詢

 ft_stopword_file    (built-in): 停詞文件,這個文件里的詞查詢時會忽略掉

 

使用方法及注意

首先建立全文索引,語句如下:

create fulltext index 索引名 on 表名(列名...)

使用語句:

where match(列名...) against(‘ 詞語1 詞語2 ’); //匹配詞語1 詞語2

如果要使用布爾查詢或短語查詢,如果使用短語的話,速度會慢很多,因為全文索引無法判斷是否精確匹配了短語,得回表過濾。:

where match(列名...) against(‘ “短語1” ’);  //在單引號里用雙引號包裹一個短語,讓返回結果精確匹配指定的短語
where match(列名...) against(‘ +詞語1 -詞語2 ’ IN BOOLEAN MODE);  //返回結果必須含有詞語1,但不能有詞語2
where match(列名...) against(‘ >詞語1 <詞語2 ’ IN BOOLEAN MODE);  //含有詞語1的話優先級升高,含有詞語2的話優先級降低

也可以把全文匹配的結果返回,這是一個浮點數,表示這一行關於這些詞語的匹配度:

select id,match(列名...) against(' 詞語1 ') as factor from 表名 where....    //返回每行匹配詞語1的匹配度

 

全文索引帶來的負面影響:

  1. 占有存儲空間更大,如果內存一次裝不下全部索引,性能會非常差。

  2. 增刪改代價更大,修改文本中10個單詞,則要操作維護索引10次,而不是普通索引的一次。

  3. 如果一個列上有全文索引則一定會用上,即使有性能更好的其他索引也不會用上。由於只是存儲文檔指針,也就用不上索引覆蓋。

總之就是性能不如普通索引,使用時要衡量一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM