以前只是簡單聽說過Mysql有全文索引,但是一直沒有認真去了解過。最近在《MYSQL必知必會》中學習到這個知識點,做下記錄。
首先,什么是全文索引?簡單來說,全文索引其實就是類似於LIKE語句,把包含一定的字符串的的行記錄挑選出來。那么問題來了,既然只是達到這個需求的話使用LIKE就行了,LIKE不行的話也還能使用正則表達式,為什么還要大費周章弄個全文索引出來呢?書上提到了三個原因:
①性能,Like通配符和正則表達式通常需要全表掃描,且極少使用表索引,所以這些搜索非常耗時。
②不能明確控制,單單使用通配符和正則表達式很難甚至不能明確地控制匹配什么和不匹配什么。
③結構不夠智能,通配符和正則都是返回所有滿足條件的所有行,並且這種返回是相對無序的,不智能的。而全文索引會按照匹配等級對輸出結果排序,在前面的更有可能是需要的,更加智能。
那么怎么使用全文索引呢?
首先要在創建表的時候啟用全文索引:
CREATE TABLE productnotes (
note_id int NOT NULL AUTO_INCREMENT,
note_text text NULL,
FULLTEXT(note_text)
) ENGINE=MYISAM;
這里的FULLTEXT(note_text)就開啟了全文索引。開啟以后我們就能對note_text使用全文索引,並且在增加更新刪除行的時候,Mysql會自動幫我們更新索引。
全文索引的語法:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');
注意上面語句的 Match(note_text) Against('rabbit') ,Match表示針對note_text列進行搜索,Again括號里面指定的東西作為搜索文本。
那么如果是上面這條語句,Mysql會把所有note_text中含有rabbit的行記錄選出來。相當於 LIKE '%rabbit%' ;
但是這里必須談一談,文章開頭所說到的智能是什么意思,問什么會和LIKE不同?實際上,使用全文索引不僅僅只是把所有滿足條件的行記錄挑選出來,而且會根據 行中詞的數目、唯一詞的數目、整個索引中詞的總數、包含該詞的行的數目 這些因素計算出來一個“等級”。等級越大代表越有可能是我們需要的記錄, 然后Mysql會把高等級的行記錄先顯示出來,亦即把更可能是我們需要的搜索結果先顯示出來。這就是智能的涵義。
另外,全文索引還有兩種模式:查詢擴展和布爾文本搜索。
查詢擴展:
SELECT note_text FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION) ;
開啟了查詢擴展,Mysql會返回更多的有可能是我們需要的結果,顧名思義“擴展”嘛。此時Mysql會對數據和索引做兩次掃描來完成搜索,步驟如下:
①首先,進行基本的全文索引,找出滿足條件行。
②檢查上訴結果,並選出所有有用的詞。
③Mysql再次進行全文索引,並且 不僅使用原查詢詞語,而且加上步驟②選出的詞。
布爾文本搜索:
SELECT note_text FROM productnotes
WHERE Mtach(note_text) Against('heavy -rope* IN BOOLEAN MODE);
開啟了布爾模式之后,我們能通過布爾操作符對查詢條件做更加精確的要求。比如說上面語句的功能就是:匹配包含heavy但不包含任意以rope開始的詞的行。
到這里,全文索引的基礎知識就這些了,更具體的或者原理還是看書吧。