談談mysql locate函數

大家都知道,當我們mysql需要使用模糊查詢的時候,往往會使用like去做相關查詢條件的模糊匹配,但是很多場景下,使用locate會獲取同樣的效果

create table user(
	id int primary key auto_increment,
	name varchar(18),
	description varchar(255)
) charset=UTF8;

select * from user order by id;

在這裏插入圖片描述
測試環境插入如上數據:
場景1,我麼需要查詢所有名字中含有 王 的所有數據,用like很簡單

select * from user where name like '%王%' order by id;

那麼使用locate如何去實現呢,首先我們先看看locate的用法,如下爲官方給出的該函數的詳細使用說明
在這裏插入圖片描述
意思也比較簡單

LOCATE(substr,str)
LOCATE(substr,str,pos)

1,從str的起始位置開始匹配str中的substr串,如果匹配上,返回下標,如果沒有匹配上,返回0,如果substr或者str爲null的時候,返回null
2,表示從下標爲pos(int值)處開始匹配

使用locate實現上述效果:

select * from user where locate('王',name)

在這裏插入圖片描述

但是如果我現在需求是找出所有名字中含有王,但是不姓王的人找出來,使用like就不太好實現了,但是使用locate就很容易實現,我們用下面那種實現方式如下

select * from user where locate('王',name,2)

在這裏插入圖片描述
我們從第2個字符串開始匹配,就很把所有姓王的給過濾掉了

關於locate的用法如上,結合具體的業務,配合合理的數據庫設計,可以很容易避開復雜的like查詢。

問題:但是有一種說法是在同樣數據量情況下,使用locate查詢比使用like效率要高,但是查看語句的執行計劃,二者是一模一樣的,不明白是爲什麼,官方也沒找到相關說明,還望知道的大神可以留言一起交流一波!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章