使用MySQL的全文檢索實現Like索引

2021-08-30 04:01:35 字數 1401 閱讀 4724

在資料庫使用中,dba都會告訴大家sql的like條件為%***%號時,由於不能使用索引,當資料量變大時(比如超過百萬條),全表掃瞄會導致效能很差。

但是在實際業務中,很難避免這種需求。比如模糊搜尋使用者帳號,暱稱之類。既然這個需求必須做,但又不可以直接用like。這裡我和大家分享一下我們關於這種需求的一種解決方案。當然別人也可能採用過類似的辦法,我不是很清楚。所以也用一下「原創」吧。

mysql資料庫很早就支援全文索引,但是全文索引和like語句是不同的。具體點說,全文索引的單位是詞,耳like匹配的是字元。當然實際的區別更大,比如「老鼠愛大公尺」這段文字用全文搜尋的話,條件「老鼠愛大公尺」,「老鼠和大公尺」,「大公尺老鼠」,「大公尺與老鼠」會搜尋到內容,但是「愛」,「鼠愛」,「愛大」不會搜尋到內容。反之,使用like搜尋時,「老鼠和大公尺」,「大公尺老鼠」,「大公尺與老鼠」不會找到內容,而「愛」,「鼠愛」,「愛大」會找到內容。我們這裡不討論兩種方式的優劣,根據實際情況每種功能都會有各自的實際需求。比如對於大段文字,全文檢索是最好的方法,但是對於姓名,帳號,暱稱等很短的通常無意義文字,like會更合適一些。

雖然全文檢索和like搜尋不同,但是在特殊情況下,可以用全文搜尋功能來實現like搜尋。具體就是每個字元作為乙個詞,而且使用雙引號來限制詞精確匹配(簡單點說就是老鼠大公尺和大公尺老鼠不同),這樣可以實現like搜尋的功能。

下面還是說一下具體的做法吧。

首先,資料庫指定 --ft_min_word_len=2 --ft_stopword_file=""。第乙個引數是告訴資料庫,小於2個字元的詞忽略。第二個是告訴資料庫不忽略任何特殊詞。這些設定是給實現功能創造條件。

然後建搜尋表

create table  tbl_search (

id int(10) unsigned not null auto_increment,

name varchar(500),

primary key (id),

fulltext key idx_name (name)

) engine=myisam auto_increment=1;

使用上面的**對要搜尋的內容編碼,比如內容是「藍皮鼠2008」,編碼後的結果是「84dd 76ae 9f20 32 30 30 38」。將編碼後的內容存入name欄位。

使用如下sql語句進行搜尋

select * from tbl_search where match(name) against('"76ae 9f20 32"' in boolean mode)

上面的搜尋是搜「皮鼠2」,應該可以搜到相關的內容。

最終效果:

[b]在150萬條記錄時,比模糊like快50到100多倍[/b]

like %皮鼠% 用兩秒左右

match 用 0.005 到 0.01秒左右

使用mysql實現全文檢索功能

檢視系統預設分片規則 預設innodb下 最小分片為3位 空格切分 show variables like ft 檢視預設分配規則建表 建立表 create table test id int 11 unsigned not null auto increment,product name varc...

mysql全文檢索

全文索引在 mysql 中是乙個 fulltext 型別索引。fulltext 索引用於 myisam 表,可以在 create table 時或之後使用 alter table 或 create index 在 char varchar 或 text 列上建立。對於大的資料庫,將資料裝載到乙個沒有...

mysql全文檢索

mysql到版本3.23.23時,開始支援全文檢索,通過語句select from match against 來在整個表中檢索是否有匹配的,全文索引是乙個定義為fulltext的型別索引,應用在myisam表中。值得一提的是對於乙個大的資料庫來說,把資料裝載到乙個沒有fulltext索引的表中,然...