日期:2014-05-17  浏览次数:20432 次

不用like,不用in,那你们用啥?
本帖最后由 diaodiaop 于 2013-03-21 21:46:30 编辑

create table Demo
(
id int identity(1,1) primary key,
name varchar(100),
tel varchar(100)
)
insert into Demo values('小明','13333332222')
insert into Demo values('小李','13833332222')
insert into Demo values('小张','15933332222')
insert into Demo values('小赵','13333338899')
insert into Demo values('小王','13888888888')
--查询号码包含2222的
select * from Demo where tel like '%2222%'
--查询手机号是133开头的
select * from Demo where tel like '133%'
--查询尾号是8899的
select * from Demo where tel like '%8899'
--查询ID在 2 3 4之间的
select * from demo where id in(2,3,4)


很简单的问题 大家都能会做.但是大家又都说 like  in 效率不行.. 那代码改如何?
我只能想到

select * from demo where CHARINDEX('2222',tel)>0

select * from demo where left(tel,3)='133'

select * from demo where right(tel,4)='8899'

select * from demo where id=2 
union all select * from demo where id=3 
union all select * from demo where id=4



但是 这样真的好么????


XX你怎么看.

------解决方案--------------------
charindex、patindex、前面两个主要是对字符串类型用的,有其特殊地方,但是说道性能,恐怕不见得很高,特别是出现在where的时候,而like(比较通用,但是如果%在前面,那就不走索引,性能低下) 、left(某些情况下效率反而极高,不要一概而论)、right(这个就比较耗性能了)
------解决方案--------------------
引用:
本帖最后由 diaodiaop 于 2013-03-21 21:46:30 编辑
            SQL code?12345678910111213141516171819create table Demo(id int identity(1,1) primary key,name varchar(100),tel varchar(100))insert……

这个问题相当简单,只要你再做一些操作,后,我保证你上面的4个语句都可以用到INDEX,大大的提高效率。
提示一下,你已经做对了一半的事情了,还有另外一半没有做完。
顺便说一下,你那个IN的句子改为了union all 后 效率反而差了3倍,知道不?
------解决方案--------------------
左起的,可以用字串比交的方式。
比如 a>='13300000000' and a<'13400000000'

中和右的,或许就用like吧。

至于全文索引, 这个场合,去理解下适用不再说吧。
------解决方案--------------------
考考大家2个问题,
1 ,既然charindex,left,right不一定能优化,是因为它们还是没有有效的利用到INDEX,那如何才能有效的利用到INDEX,提高性能呢?

2,很明显
    2.1 select * from demo where id in(2,3,4) 
    2.2 select * from demo where id=2 or id=3 or id=4 
    2.3 select * from demo where id=2  union all select * from demo where id=3  union all select * from demo where id=4 


上面2.1跟2.2的效率实际上是一模一样的,而2.3反而比前面两个效率差了3倍,为什么?

今天会公布答案,