資料庫like匹配的實現猜測

2021-09-06 14:16:14 字數 1156 閱讀 7528

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

搜尋功能實現資料庫like

like用來匹配一部分的,任何字元出現任何位置區分大小寫。select from table where col like a 檢索以a結尾的內容 select from table where col like a 檢索包含a的內容 select from table where col like...

Access資料庫的Like查詢

原文 作業系統 pnt4.0 sp5 iis4 access 97 工具 asp 問題 我有乙個客戶檔案資料庫,有大概13000條資料,用asp提取資料庫記錄的時候用 select name,address,lxr,tel from khda where name like 江華 選出的記錄為0條,...

Android Room資料庫Like模糊查詢

模糊查詢的一般用like關鍵字 查詢表user中的user name 包含 黃 字的user集合 select from user where user name like 黃 room中用 代替 號示例 相當於 號 transaction query select from user where ...