2019-10-25 sql的in()里面数据太多怎么办

问题:

项目里一直有个问题,就是sql查询一张表(t)需要根据用户公司权限,而用户公司权限的值是根据接口从另外一个项目查询过来的,(公司权限,因为有很多分公司,用户可能有很多公司的权限,就是拥有这些公司的id)当然表(t)里的记录都有对应哪家公司的id,所以查询记录的时候会带上公司id,当有些用户拥有几百家公司id的话,那这个sql里的id in(几百个),这样查询效率超级差,因为我们知道in本身效率就不高,加上in很多的话那就更不行了,加上如果表(t)中数据有几百万,这样那些拥有几百个公司id的用户查询经常超时。

解决

1,比较笨的方法

就是查询资料知道,in里面的值最大上限好像是300多(具体忘记了),而超过一定量的话就不走索引的,所以测试验证可知,in里面最好不要超过50(好像),不然就慢下来,所以办法是多次执行这个sql,就是在代码中把in里的list以20个数据分开几个list,通过for循环去查询,这样一次查询的sql里的in固定为20,for多次去执行sql,这样虽然有多次的i/o操作,但是其实查询的速度还是很快的,所以勉强可以接受。

2,连表查

就是在这个项目里维护一个用户与公司id的表(u),然后每次查询,用left join去查,替换in,这样就会快很多。但是这样的话,有个麻烦,就是另外一个项目在修改用户的公司权限的时候,要顺带更新这个u表。

3,也是连表,但是是太同一个数据库的时候

https://blog.csdn.net/pengyufight/article/details/77523404

第一个办法是自己想的,2,3是百度的

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值