全文索引創(chuàng)建
1. alter table [table_name] add FULLTEXT [index_name] (column);
全文索引模式
1. 自然語言模式
select unique_code, title from tb_name where match(unique_code) against ('album page');
其中unique_code 上有全文索引
mysql將搜索詞語 “album page” 分成兩個獨立的關(guān)鍵詞進行搜索。然后根據(jù)搜索結(jié)果與搜索詞的相關(guān)性來排序。(在s使用全文索引進行排序的時候,無法再使用索引排序,所以不想使用文件排序的話,在全文索引的查詢中就不要使用order by)。
2. boolean? 全文索引
boolean 搜索通過停用詞列表過濾掉噪聲詞,除此之外還要求搜索關(guān)鍵詞必須大于 “ft_min_word_len" 小于“ft_max_word_len"。 其搜索返回的結(jié)果是未經(jīng)排序的。
“+mysql”:? 必須包含"mysql"
“-mysql”:不可以包含“mysql”
“~mysql”:包含mysql的rank值更低
“mysql”:包含mysql的rank值更高
“mysql*”:包含以mysql開頭的單詞的行rank更高
“""”: 短語搜索,要求精確匹配質(zhì)指定的短語
boolean? 索引使用
select unique_code, title from tb_name where match(unique_code) against ('+album +page');
mysql全文索引沒有查詢結(jié)果
? ? a. 在自然搜索時,如果搜索的詞在超過50%的記錄里面都出現(xiàn)了,那么自然語言搜索將不會搜索這類詞。
? ? b. mysql 全文索引是按照單詞來匹配的。假設(shè)文本是“explore_page",? 用“explore”是不能匹配出結(jié)果的,因為mysql認為explore_page是一個單詞。但是如果在boolean模式下,match(unique_code) against ('explore*' in boolean mode) 是可以匹配到結(jié)果的。
全文索引優(yōu)化策略
1. 全文索引比普通索引有更多的碎片問題,所以要經(jīng)常使用 OPTIMIZE TABLE 來減少碎片。?
2.? 保證索引緩存足夠大,從而保證所有的全文索引都能夠緩存在內(nèi)存中。可以為全文索引設(shè)置單獨的鍵緩存,保證不會被其他索引緩存擠出內(nèi)存。
2. 提供一個停詞表:尤其是對某些專業(yè)的文檔,某一些關(guān)鍵詞會大量出現(xiàn)。
3. 忽略一些太短的詞可以提升全文索引的效率;索引詞的最小長度可以通過? “ft_min_word_len" 來配置。
注意:當調(diào)整允許最小詞長后,需要通過OPTIMIZE TABLE 來重建索引才會生效。
4. 當向全文索引表中導入大量數(shù)據(jù)時,最好先 “DISABLE KEYS” 來禁用全文索引,然后在導入結(jié)束后使用 “ENABLE KEYS” 來建立全文索引。
Notes:停用詞表,最小詞長都可以通過減少索引詞語來提升全文索引的效率,但是同時也降低了搜索的精確度。
5. 如果數(shù)據(jù)集特別大,需要對數(shù)據(jù)進行手動分區(qū),最好通過外部的搜索引擎來實現(xiàn),如:Lucence或者Sphinx。
全文索引的限制
1. 全文索引只有全部在內(nèi)存中的時候,性能才會非常好。如果內(nèi)存無法裝載全部索引,那么搜索速度會非常的慢。
2. 全文索引會影響查詢優(yōu)化器的工作。如果查詢中使用來match against,而對應的列上有可用的全文索引,那么mysql就一定會使用這個全文索引,而忽視掉性能更好的其他索引。
3. 全文索引不可能使用索引覆蓋掃描。