大家都知道,当我们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效率要高,但是查看语句的执行计划,二者是一模一样的,不明白是为什么,官方也没找到相关说明,还望知道的大神可以留言一起交流一波!