数据库语句性能问题比较

征途开始 C++后台  2017-11-06 09:54:32
在数据表select语句中的where条件。这两种写法,哪一种效率更高?谢谢
第一种:
WHERE (spid=' ' AND pay_channel='wtf' AND mid='123456' ) OR (spid=' 0000' AND pay_channel='wtf' AND mid='123456' )

第二种:
WHERE (spid=' ' OR spid=' 0000' ) AND pay_channel='wtf' AND mid='123456'
...全文
214 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zjcxc 2017-11-07
通常两种写法没有可比性,查询优化器确定你的条件处理顺序 (spid=' '  OR spid=' 0000' )  不一定先执行,可能是后面的条件先执行 假设是后面的 AND 先执行的情况,对于第一种写法,假设 and 成功,第一个 OR 不I满足,是不是得再判断一次 ANS 的条件? 对于第2种,AND 只判断一次,是不是似乎要快一点? 而假设你们说的短路,第2个成功了,第2个不用判断了,似乎第1种写法好点? 那既然分析到这里,两种写法都可能有性能好的时候,所以结论就是没有可比性了,性能取决于查询优化器最终选定的处理方法是否合理 一般我们不会在意这种有不确定性的写法选那一种,因为通常都不会有那种好,只有实际运行时真发生性能问题的时候,再去分析
  • 打赏
  • 举报
回复
征途开始 2017-11-07
引用 8 楼 zjcxc 的回复:
通常两种写法没有可比性,查询优化器确定你的条件处理顺序 (spid=' '  OR spid=' 0000' )  不一定先执行,可能是后面的条件先执行 假设是后面的 AND 先执行的情况,对于第一种写法,假设 and 成功,第一个 OR 不I满足,是不是得再判断一次 ANS 的条件? 对于第2种,AND 只判断一次,是不是似乎要快一点? 而假设你们说的短路,第2个成功了,第2个不用判断了,似乎第1种写法好点? 那既然分析到这里,两种写法都可能有性能好的时候,所以结论就是没有可比性了,性能取决于查询优化器最终选定的处理方法是否合理 一般我们不会在意这种有不确定性的写法选那一种,因为通常都不会有那种好,只有实际运行时真发生性能问题的时候,再去分析
主要是要大量重复执行,所以想优化。现在改成了:and spid in (' ', '0000') in的效率比or高一点点
  • 打赏
  • 举报
回复
征途开始 2017-11-06
@rucypli 麻烦分析下
  • 打赏
  • 举报
回复
征途开始 2017-11-06
因为这条语句需要大量重复执行,所以这个优化很重要
  • 打赏
  • 举报
回复
征途开始 2017-11-06
引用 6 楼 destory27 的回复:
WHERE (spid=' ' AND pay_channel='wtf' AND mid='123456' ) OR (spid=' 0000' AND pay_channel='wtf' AND mid='123456' ) 提供短路操作
短路。。。
  • 打赏
  • 举报
回复
destory27 2017-11-06
WHERE (spid=' ' AND pay_channel='wtf' AND mid='123456' ) OR (spid=' 0000' AND pay_channel='wtf' AND mid='123456' ) 提供短路操作
  • 打赏
  • 举报
回复
听雨停了 2017-11-06
引用 4 楼 xieshangjian 的回复:
[quote=引用 3 楼 qq_37170555 的回复:]

create table my_table(
spid varchar(20),
pay_channel varchar(20),
mid varchar(20)
)
insert into my_table values('','wtf','123456');
insert into my_table values('0000','wtf','123456');

--用表连接的方法去实现,不要where or
select a.* from 你的表 a
inner join on my_table b on a.spid=b.spid and a.pay_channel=b.pay_channel and a.mid=b.mid
老哥,你理解错了。就是一张啊。[/quote] 我肯定知道你上面就是一张表啊,我的意思是你把where条件的值插入到一个表中,然后用这个表连接你原来的表,这样就不用where or了
  • 打赏
  • 举报
回复
征途开始 2017-11-06
引用 3 楼 qq_37170555 的回复:

create table my_table(
spid varchar(20),
pay_channel varchar(20),
mid varchar(20)
)
insert into my_table values('','wtf','123456');
insert into my_table values('0000','wtf','123456');

--用表连接的方法去实现,不要where or
select a.* from 你的表 a
inner join on my_table b on a.spid=b.spid and a.pay_channel=b.pay_channel and a.mid=b.mid
老哥,你理解错了。就是一张啊。
  • 打赏
  • 举报
回复
听雨停了 2017-11-06

create table my_table(
spid varchar(20),
pay_channel varchar(20),
mid varchar(20)
)
insert into my_table values('','wtf','123456');
insert into my_table values('0000','wtf','123456');

--用表连接的方法去实现,不要where or
select a.* from 你的表 a
inner join on my_table b on a.spid=b.spid and a.pay_channel=b.pay_channel and a.mid=b.mid
  • 打赏
  • 举报
回复
相关推荐
发帖
MySQL
加入

5.5w+

社区成员

MySQL相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2017-11-06 09:54
社区公告
暂无公告