MySQL全文索引


MyISAM全文索引作用對象是"全文集合",它將需要索引的所有列拼接成字符串,然后進行索引.它是一類特殊的雙BTree索引,共有兩層,第一層是所有關鍵字,然后對於每一個關鍵字,是一組文檔指針.

全文索引的詞語過濾規則:

1. 停用詞列表中的詞不會被索引.默認停用詞根據通用英語來設置,可以使用參數ft_stopword_file指定一組外部文件使用自定義停用詞

2. 長度小於ft_min_word_len和長度小於ft_max_word_len詞語,都不會被索引

全文索引不會存儲關鍵字具體匹配哪一列,如果需要根據不同的列來進行組合查詢,不需要對每一列來建立索引.所以在MATCH AGAINST子句中,所有列的相關性是同等重要的.

 

自然語言全文索引

相關度:索引中出現次數越少的詞語,相關度就越高,當出現此處超過50%自然語言搜索則不會搜索這個詞語.所以常見問題就是當數據集合很少的時候,全文索引查詢返回不了結果

自然語言全文索引查詢示例:

SELECT film_id, title, RIGHT(description, 25),
    MATCH(title, description) AGAINST('factory casualties') AS relevance
FROM sakila.film_text
WHERE MATCH(title, description) AGAINST('factory casualties')

和普通查詢不同,自然語言全文索引是按相關度排序的,在一次查詢使用兩次MATCH()不會有額外消耗,MySQL會自動識別值進行一次搜索.此外,MATCH()函數中指定的列必須和建立索引的列完全相同,否則無法使用全文索引

 

布爾全文索引

布爾全文索引可以通過特定的前綴修飾符來定制索引.功能如下圖

 

使用示例

SELECT film_id, title, RIGHT(description, 25)
    FROM sakila.film_text
WHERE MATCH(title, description) 
    AGAINST('+factory +casualties' IN BOOLEAN MODE)

結果是精確匹配,只有一條記錄

 

全文索引的限制

1.全文索引只有完全讀入內存速度才會快,否則速度會非常慢,因為會產生大量隨機IO

2.全文索引的操作代價很大,修改一段文本的100個單詞,需要100次索引操作

3.當使用了MATCH AGAINST的列上有全文索引時,一定會使用這個全文索引,而忽略其他可用索引,即使性能不好(似乎新版本已經改進了這個,如果有更好的索引,還是會使用的)

4.全文索引只能做全文匹配,任何其他WHERE條件都只能在全文搜索返回記錄后才能進行

5.全文索引不存儲索引列的實際值,所以不能做索引覆蓋掃描

6.使用全文索引如果需要使用相關性以外的排序,都需要用到文件排序(filesort)

 

全文索引的優化

1.使用OPTIMIZE TABLE減少碎片問題

2.保證索引緩存足夠大

3.使用一個好的停用詞表,例如要索引和MySQL相關的文檔,則最好將"MySQL"放入停用詞表,因為在這類文檔中這個詞會出現的很頻繁

4.忽略太短的詞語可以提升全文索引效率,但同時搜索精度會下降,這個需要權衡

5.有全文索引的表需要導入大量數據時,先DISABLE KEYS停用索引,導入完成后在ENABLE KEY開啟索引


免責聲明!

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



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