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