sql语句,in

心随念 2017-07-24 11:36:57
大家好,在下遇到这么一个问题:

select * from table where id in(xx,xx,x,xx,);

其中in()中的数据很多 ,有成千个甚至 4、5千个5、6千个。(总之就是超级多的意思)

这样sql 合理吗?如果不合理,有什么办法可以把上边的sql 给优化一下。

请各位大神不吝赐教
...全文
393 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
心随念 2017-07-27
  • 打赏
  • 举报
回复
分数不多,来者有份,感谢各位的建议,结帖
qq_35942223 2017-07-26
  • 打赏
  • 举报
回复
引用 13 楼 u012445835 的回复:
[quote=引用 12 楼 zc881124 的回复:] [quote=引用 7 楼 u012445835 的回复:] [quote=引用 5 楼 zc881124 的回复:] 这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的[/quote] 这个id不需要确定,只要是连续的,确定首尾,
引用 7 楼 u012445835 的回复:
[quote=引用 5 楼 zc881124 的回复:] 这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的[/quote] 如果id是连续的,首尾取出来[/quote] sorry,我的意思可能没有表达清楚,ID就是不连续的,并且是不确定的[/quote] 用between局限性太多了,你in里面的数据是可以用查询语句查出来么?如果可以用exists
心随念 2017-07-25
  • 打赏
  • 举报
回复
引用 12 楼 zc881124 的回复:
[quote=引用 7 楼 u012445835 的回复:] [quote=引用 5 楼 zc881124 的回复:] 这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的[/quote] 这个id不需要确定,只要是连续的,确定首尾,
引用 7 楼 u012445835 的回复:
[quote=引用 5 楼 zc881124 的回复:] 这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的[/quote] 如果id是连续的,首尾取出来[/quote] sorry,我的意思可能没有表达清楚,ID就是不连续的,并且是不确定的
JamesShizg 2017-07-24
  • 打赏
  • 举报
回复
考虑用exists
心随念 2017-07-24
  • 打赏
  • 举报
回复
不要沉,顶一下
110成成 2017-07-24
  • 打赏
  • 举报
回复
引用 7 楼 u012445835 的回复:
[quote=引用 5 楼 zc881124 的回复:] 这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的[/quote] 这个id不需要确定,只要是连续的,确定首尾,
引用 7 楼 u012445835 的回复:
[quote=引用 5 楼 zc881124 的回复:] 这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的[/quote] 如果id是连续的,首尾取出来
qq_19695321 2017-07-24
  • 打赏
  • 举报
回复
or的效率是n级别 in的消息时log(n)级别
心随念 2017-07-24
  • 打赏
  • 举报
回复
引用 8 楼 minemine0418 的回复:
http://www.cnblogs.com/panz/archive/2016/05/31/5544767.html 这个博客看看,可以参考
如果使用临时表,会先往临时表中插入数据,再从临时表中取出数据,这样会不会存在线程安全问题啊
编号94530 2017-07-24
  • 打赏
  • 举报
回复
数据太多就不能用这方法优化。 不行就只能用存储过程了。
minemine0418 2017-07-24
  • 打赏
  • 举报
回复
http://www.cnblogs.com/panz/archive/2016/05/31/5544767.html 这个博客看看,可以参考
心随念 2017-07-24
  • 打赏
  • 举报
回复
引用 5 楼 zc881124 的回复:
这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
id 是主键,自动会存在索引,另外使用between也是不现实的,因为这个ID是不确定的
自由自在_Yu 2017-07-24
  • 打赏
  • 举报
回复
select * from A where id in(select id from B); select a.* from A a where exists(select 1 from B b where a.id=b.id); in()适合B表比A表数据小的情况 exists()适合B表比A表数据大的情况 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.
110成成 2017-07-24
  • 打赏
  • 举报
回复
这个不是in和exists的能解决的,首先尽量减少全表扫描,可以考虑between, 增加索引。
qq_35942223 2017-07-24
  • 打赏
  • 举报
回复
exists,in会全表扫描
daphne_furong 2017-07-24
  • 打赏
  • 举报
回复
where id in(***,***,***) 跟 where (id=*** or id=*** or id=***)差不多

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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