sql语句中当条件的数量非常大时where...in条件子句用什么更好的方法代替?

卿柠 2012-07-17 01:43:06
当sql语句中的where条件是where id in(1,2,3,4,8,11,23,56,89,110,...),即当in的数量相当大时,这种sql语句是很劣质的,那么用什么其它更好的方法解决这样的问题呢?
...全文
34763 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloyou0 2012-08-16
  • 打赏
  • 举报
回复
到底是咋样的情况啊...

[Quote=引用 20 楼 的回复:]

今天偶也遇到这问题了,in中的数据少则几万,多则几十到几百万不等,“效率”很大的问题呀 唉。。。。
[/Quote]
kugouming 2012-08-15
  • 打赏
  • 举报
回复
今天偶也遇到这问题了,in中的数据少则几万,多则几十到几百万不等,“效率”很大的问题呀 唉。。。。
yunprince 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 5 楼 的回复:
能告诉我你列表中的id是怎么来的吗?

我觉得这才是问题的要点。如果可能的话,把当初获得这一组id的sql语句跟后面要实现的sql语句结合起来做关联查询。

如果这一组id不是用某个sql语句得到的,那恐怕要重新考察一下业务需求和实现方案了,真的需要对这么大的一组“没来由”的id进行批量处理吗?


———————————————————————————……
[/Quote]

接着楼主提个问,嘿嘿

没测试过,你的意思是联合查询比where in 更好?

maquan 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
能告诉我你列表中的id是怎么来的吗?
[/Quote]
我觉得这才是问题的要点。如果可能的话,把当初获得这一组id的sql语句跟后面要实现的sql语句结合起来做关联查询。

如果这一组id不是用某个sql语句得到的,那恐怕要重新考察一下业务需求和实现方案了,真的需要对这么大的一组“没来由”的id进行批量处理吗?


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
cangzhu 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

同意楼上,仅几个,几十个(甚至几百个)的 IN ID 效率低不到哪去。不然你还有什么好办法。
[/Quote]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
helloyou0 2012-07-18
  • 打赏
  • 举报
回复
嘿嘿, 没看我上面贴的blog吧...那是插入临时表再join查询...数据大的情况比in快.

[Quote=引用 17 楼 的回复:]

引用 16 楼 的回复:

引用 5 楼 的回复:
能告诉我你列表中的id是怎么来的吗?

我觉得这才是问题的要点。如果可能的话,把当初获得这一组id的sql语句跟后面要实现的sql语句结合起来做关联查询。

如果这一组id不是用某个sql语句得到的,那恐怕要重新考察一下业务需求和实现方案了,真的需要对这么大的一组“没来由”的id进行批量处理吗?


——————————……
[/Quote]
yiwusuo 2012-07-18
  • 打赏
  • 举报
回复
同意楼上,仅几个,几十个(甚至几百个)的 IN ID 效率低不到哪去。不然你还有什么好办法。
maquan 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
没测试过,你的意思是联合查询比where in 更好?
[/Quote]
要看具体情况。一般来说,如果 in list 是一个比较小的常量集合的时候,in 的效率还是很好的,但当 in list 比较大的时候(比如超过 1000 以后),效率就会变差了,这时候很可能就是关联查询效率更高了。
helloyou0 2012-07-17
  • 打赏
  • 举报
回复
有兴趣的话可以看这个blog
http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/

不过,就如blog结尾所说,只有在数量比较大的情况下才能看出明显效果.


如果你的id就那么几个,几十个...我不认为需要考虑这点差别.

1,2楼分开查询的方法我认为不可取, 因为mysql内部的处理大概也不会比那样更差吧...




[Quote=引用楼主 的回复:]
当sql语句中的where条件是where id in(1,2,3,4,8,11,23,56,89,110,...),即当in的数量相当大时,这种sql语句是很劣质的,那么用什么其它更好的方法解决这样的问题呢?
[/Quote]
OWJ-Think 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

或者是遍历传入的 id 组,在循环里逐一查询,更明智点?
[/Quote]

就看LZ 到底Where 来干什么的. 是更新,删除还是怎么的.再说吧
xuzuning 2012-07-17
  • 打赏
  • 举报
回复
或者是遍历传入的 id 组,在循环里逐一查询,更明智点?
卿柠 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

那就不是 sql语句很劣质的 的问题了,既然你允许传入一万个 id 值,那么为什么要说包含这一万个 id 值得 in 子句是劣质的呢?
[/Quote]

对,我应该学会咬文嚼字,不能说劣质,只能说我在这里这样用in是很脑残的!
xuzuning 2012-07-17
  • 打赏
  • 举报
回复
那么你认为把传入的 id 组先存入表,然后再关联查询是否更明智呢?
卿柠 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

能告诉我你列表中的id是怎么来的吗?
[/Quote]

$sql = 'select * from table where id in(' . $id . ')';

$id 的值是多个的,当它的值是一个很庞大的数目时,用in显然是很不明智的,求高手妙方!!!
xuzuning 2012-07-17
  • 打赏
  • 举报
回复
那就不是 sql语句很劣质的 的问题了,既然你允许传入一万个 id 值,那么为什么要说包含这一万个 id 值得 in 子句是劣质的呢?
卿柠 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

能告诉我你列表中的id是怎么来的吗?
[/Quote]

传值过来的
xuzuning 2012-07-17
  • 打赏
  • 举报
回复
能告诉我你列表中的id是怎么来的吗?
卿柠 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

select * from x where id=1 union all select * from x where id=2 union all ...
[/Quote]

就这样一直写下去吗?
一起混吧 2012-07-17
  • 打赏
  • 举报
回复
这个就不错了。
littlebirds 2012-07-17
  • 打赏
  • 举报
回复
select * from x where id=1 union all select * from x where id=2 union all ...
加载更多回复(1)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧