天天看點

資料庫like比對的實作猜測

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