like模糊查询浅显易懂的优化思路

假设有一张user表经常查询名字,给名字建立一个索引。那么名字这个索引的样子大概
假如数据中只有:

赵一 钱二 张三 张四 李四 王五
按照字典排序,在索引中大概的结果应该是 
李四 王五 张三 张四 赵一 钱二

如果我们要找到张三这个人,只知道他的姓张,然后在找到他的名字,用sql写出来大概就是

 SELECT * FROM user WHERE name = '张%' 
 
 这一段sql是走索引的,因为我们可以排除掉不是张姓的人,查询速度应该还行

只知道他的名字不知道他的姓那这时候走索引就走不通了。sql类似于

 SELECT * FROM user WHERE name LIKE '%三' 

这时候可以用空间换时间,新增加一列用于反转存放名字,就叫name_reverse。然后给这个列建立索引。 索引里面存放的样子大概就变成了(加字段和索引就不提了)

二钱 五王 四李 三张 四张 一赵
 这个时候 SELECT * FROM user WHERE name_reverse LIKE '三%'
 和上面 SELECT * FROM user WHERE name LIKE '%三' 
 的效果是一样的。同样可以走索引

但是这是他只有两个字你刚好知道他最后一个字,假如他又三个字,叫张三丰。你只知道他有个三。那你这个索引也查不出来他的名字 你的sql语句就是这个。

 SELECT * FROM user WHERE name LIKE '%三%' 这样是完全走不了索引。

所以我们可以用高级函数instr
instr(sourceString,destString,start,appearPosition)
instr(’源字符串’ , ‘目标字符串’ ,’开始位置’,’第几次出现’)

1.sourceString代表源字符串; destString代表要从源字符串中查找的子串;
2.start代表查找的开始位置,这个参数可选的,默认为1;
3.appearPosition代表想从源字符中查找出第几次出现的destString,这个参数也是可选的, 默认为1
4.如果start的值为负数,则代表从右往左进行查找,但是位置数据仍然从左向右计算。
5.返回值为:查找到的字符串的位置。如果没有查找到,返回0。

应用于模糊查询:instr(字段名/列名, ‘查找字段’) 
select * from user where instr(name, ‘三’)> 0 
等同于 select * from user where name like ‘%%’ 相较于like,instr的效率高于它的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值