資料庫like匹配的實現猜測

王滔發表於2014-03-10



insert into test_fulltext values("王正科技全文")


select * from test_fulltext where data like "%王正%"


能夠搜尋到新插入的一行資料。

data欄位並不是全文索引欄位。


其實反而不要使用match against去搜尋,也就是不要使用全文搜尋,使用全文搜尋的話,會進入全文索引結構中去尋找資料。而剛好mysql對中文分詞支援存在問題。所以mysql全文索引中建立的詞典索引中不存在那個詞語,比如

select * from test_fulltext where MATCH(data) AGAINST('王正'IN BOOLEAN MODE )

提示此表不支援全文索引,也就是沒有建立成全文索引

 

 

讀者若有什麼更好的看法,歡迎討論


ALTER TABLE `test_fulltext`
ADD FULLTEXT INDEX `idx_data` (`data`) USING HASH ;

BTREE

上面都錯誤,正確sql為:

ALTER TABLE `test_fulltext` ADD FULLTEXT (
`data`
)

因為全文索引不存在使用btree還是hash方式進行索引。就是一個詞典,何來這種索引?



建立成全文索引後,使用

select * from test_fulltext WHERE MATCH(`data`) AGAINST('王正'IN BOOLEAN MODE)

搜尋不到


使用王正反而更加能夠搜到到。

結論:like這種搜尋,是全表掃描。是對欄位中出現的內容全部進行匹配。相等匹配。不是不可以,就是效率低下,當資料量大的情況下很慢

資料庫的實現思路可能為:逐個掃描所有行,然後拿到欄位的內容。比如拿到了此行data欄位的內容,然後把內容當成一個字串去裡面查詢是否有出現過的詞語

類似於 php的程式碼實現
if(strpos($data欄位內容,要查詢的字串))!==false)
{
找到了字串
}



like匹配是基於字串的匹配(%就是對應正則匹配,也是字串配對),這樣的方式需要掃描表的所有行,拿到每行的內容進行字串匹配。其實我的理解是:最大瓶頸就是需要全表掃描。至於裡面的%正則匹配倒不是很大問題,這裡速度不會成為瓶頸,反而全表掃描耗費是時間比較長是一個大問題。

相關文章