1. 程式人生 > >mysql中對於模糊查詢like的一些總結

mysql中對於模糊查詢like的一些總結

1、常見用法:

(1)搭配%使用

%代表一個或多個字元的萬用字元,譬如查詢欄位name中以大開頭的資料:

(2)搭配_使用

_代表僅僅一個字元的萬用字元,把上面那條查詢語句中的%改為_,會發現只能查詢出下面一條資料:

2、使用like模糊查詢會導致索引失效,在資料量大的時候會有效能問題

(1)儘量少以%或者_開頭進行模糊查詢

通過explain執行計劃,我們發現,使用like模糊查詢時,如果不以%和_開頭查詢的話,索引還是有效的

以%或者_開頭查詢,索引失效

(2)使用覆蓋索引

當查詢的的條件和查詢的結果都是索引中的欄位的時候,這個索引我們可以稱之為覆蓋索引,這個時候,使用like模糊查詢索引是有效的

InnoDB中主鍵可以不新增進索引中

注意:使用覆蓋索引,對於欄位的長度是由要求限制的,一般超過長度,索引也會失效

這裡如果我查詢中帶有descripition欄位,則覆蓋索引也會失效(我這裡的資料庫經過測試最多隻支援255長度的欄位)

(3)使用全文索引

給欄位建立Full Text索引,然後使用match(...) against(...)進行檢索

注意:這種全文索引方式只對英文單詞起作用,對於中文漢字支援不夠友好,需要額外去mysql的配置檔案做一些配置修改,讓它額外支援中文

(4)使用一些額外的全文搜尋引擎來解決

Lucene,solr,elasticsearch等等

基本原理是:把mysql配置檔案中的ft_min_word_len=3改為1。(沒有這項就直接新增),然後新建一個欄位來保持分詞結果,給這個欄位建立全文索引。然後實現一個分詞模組,把詞語“大家好”拆分為“大 大家 大家好 家 家好 好”。然後用match .. against 來代替like %%,查詢出來的結果跟like的結果基本相同(如果分詞合理的話),但是效率比like高至少10倍以上。