mysql 模糊查詢


mysql 中一般使用like 來進行模糊查詢,但like 的效率非常的低,容易導致全表掃描,因此不推薦使用。

那有木有其他的方法代替like來進行模糊查詢呢?

替代方法肯定是有的,以下是幾個可替代like 進行模糊查詢的 關鍵詞

 

下面簡單介紹下各個方法的使用情況

 

測試對象  content 表

SELECT COUNT(mlzm_content.id) FROM mlzm_content

數據量: 33034 條信息

 

 

LIKE

SELECT id,Title from mlzm_content WHERE Title LIKE '%美女%'

結果:294 條記錄

耗時: 0.0130 秒

SELECT id,Title from mlzm_content WHERE Title LIKE '%模特%'

結果:10 條記錄

耗時: 0.0550 秒

結論:但查詢到結果集的數據量少的時候like耗時會增加,即總數據量不變,結果越少耗時約大

 

INSTR

語法:INSTR(str, substr)

SELECT id,title from mlzm_content WHERE INSTR(Title,'美女')>0;

結果:294 條

耗時:0.0150 秒

INSTR(str, substr) 與LOCATE(substr, str) 類似,只是參數的位置變了

 

LOCATE

語法:LOCATE(substr, str)

SELECT id,title from mlzm_content WHERE LOCATE('美女',Title)>0;

結果:294 條

耗時: 0.0150 秒

SELECT id,title from mlzm_content WHERE LOCATE('模特',Title)>0

結果:10條

耗時: 0.0760 秒

 

普通用法:

  SELECT `column` from `table` where locate('keyword', `condition`)>0

 類似 js 的 indexOf(); locate() (返回的結果為子串在字符串中第一次出現的位置,因為從1開始計數,因此只要匹配結果均大於0),沒有查找到才返回0;

 

指定位置查找:

SELECT LOCATE('bar', 'foobarbar',5);  --> 7 (從foobarbar的第五個位置開始查找)

返回 'bar' 在 'foobarbar' 第一次出現的位置(這里限制了從第5位后面開始查找,因此結果為7),位置下標是從1開始計數的。

 

POSITION

語法:POSITION(substr IN str)

SELECT id,title from mlzm_content WHERE POSITION('美女' IN Title);

結果:294 條

耗時: 0.0150 秒

 

小結:LOCATE()、POSITION()、INSTR()類似,執行效率前2這基本一致,INSTR()要比前2這稍微快一點。但3者的執行效率都要比like 的略低。

(可能是數據量不大,真實的效率有待考察,后續會利用大數據來進行效率測試后再做定論。這里的效率問題並不是一定用哪個就要好,一切都要根據實際需求測試后再做定論。

 

FIND_IN_SET

語法:FIND_IN_SET(strstrlist)

SELECT id,title from mlzm_content WHERE FIND_IN_SET('美女',Title);

結果:1 條

耗時:  0.0470 秒

SELECT id,title from mlzm_content WHERE FIND_IN_SET('模特',Title)

結果:1 條

耗時:  0.0460 秒

SELECT FIND_IN_SET('b','a,b,c,d');

耗時:  0.0020 秒

 

 

總結:

LIKE是廣泛的模糊匹配,字符串中沒有分隔符,Find_IN_SET 是精確匹配,字段值以英文”,”分隔,Find_IN_SET查詢的結果要小於like查詢的結果。

Find_IN_SET  的執行效率在同樣的結果集下,要比LIKE高。

Find_IN_SET 通常用做關鍵詞匹配,因此在實際運用中大量數據查詢可用Find_IN_SET 來代替LIKE ,減少信息量(因此關鍵詞設置非常有必要)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM