当sql语句中的where条件是where id in(1,2,3,4,8,11,23,56,89,110,...),即当in的数量相当大时,这种sql语句是很劣质的,那么用什么其它更好的方法解决这样的问题呢?

解决方案 »

  1.   

    把in中的id分开来查询,最后再合并起来。
      

  2.   

    select * from x where id=1 union all select * from x where id=2 union all ...
      

  3.   

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

  4.   


    $sql = 'select * from table where id in(' . $id . ')';$id 的值是多个的,当它的值是一个很庞大的数目时,用in显然是很不明智的,求高手妙方!!!
      

  5.   


    就看LZ 到底Where   来干什么的. 是更新,删除还是怎么的.再说吧
      

  6.   

    有兴趣的话可以看这个blog
    http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/不过,就如blog结尾所说,只有在数量比较大的情况下才能看出明显效果. 
    如果你的id就那么几个,几十个...我不认为需要考虑这点差别.1,2楼分开查询的方法我认为不可取, 因为mysql内部的处理大概也不会比那样更差吧...
      

  7.   

    同意楼上,仅几个,几十个(甚至几百个)的 IN ID 效率低不到哪去。不然你还有什么好办法。
      

  8.   

    我觉得这才是问题的要点。如果可能的话,把当初获得这一组id的sql语句跟后面要实现的sql语句结合起来做关联查询。如果这一组id不是用某个sql语句得到的,那恐怕要重新考察一下业务需求和实现方案了,真的需要对这么大的一组“没来由”的id进行批量处理吗?
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  9.   


    接着楼主提个问,嘿嘿没测试过,你的意思是联合查询比where in 更好?
      

  10.   

    要看具体情况。一般来说,如果 in list 是一个比较小的常量集合的时候,in 的效率还是很好的,但当 in list 比较大的时候(比如超过 1000 以后),效率就会变差了,这时候很可能就是关联查询效率更高了。
      

  11.   

    嘿嘿, 没看我上面贴的blog吧...那是插入临时表再join查询...数据大的情况比in快.