SQL语句 in+集合过长的问题

文章探讨了在面临SQL查询中IN子句集合过长导致的性能问题时,如何通过切分集合和改进查询策略来优化。提出了一种将大集合拆分为多个小集合的方法,并建议在数据量巨大时避免使用IN查询,转而采用连表查询以提高SQL查询效率。同时,建议定期更新横向拉伸表以进一步优化查询性能。
摘要由CSDN通过智能技术生成

解决SQL语句 in 集合过长的问题

问题:在公司写查询时候,在写人员权限查询时候,部门性质表是一张层层嵌套迭代的表(部门id,父部门id,部门级别),需求场景需要找到部门所有下级部门,按权限查询数据。

正常思路:

查询当前所在部门 编码 级别 循环迭代下级部门 拿下级部门编码 父编码 级别 继续循环
mapper层入参:

List<Po> queryUser(@Param("deptCode") List<List<String>> deptCode);
        <if test="deptCode != null and deptCode.size>0">
            and
            <foreach collection="deptCode" index="index" item="idsItem" open="(" separator="or" close=")" >
                b.OBJ_MRC in
                <foreach collection="idsItem" index="index" item="item" open="(" separator="," close=")" >
                    #{item}
                </foreach>
            </foreach>
        </if>

SQL in集合长度大于1000会报错(解决方法把一个集合拆分为多个小于集合

切分in集合两种方法

    public static List<List<String>> splitList(List<String> list, int len) {
        //list为需要拆分的集合    len 拆分的长度
        if (list == null || list.size() == 0 || len < 1) {
            return null;
        }
        List<List<String>> result = new ArrayList<List<String>>();
        int size = list.size();
        int count = (size + len - 1) / len;
        for (int i = 0; i < count; i++) {
            List<String> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
            result.add(subList);
        }
        return result;
    }

    public Map groupList(List list) {
        int listSize = list.size();
        int toIndex = 1000;
        Map map = new HashMap();     //用map存起来新的分组后数据
        int keyToken = 0;
        for (int i = 0; i < list.size(); i += 1000) {
            if (i + 1000 > listSize) {        //作用为toIndex最后没有100条数据则剩余几条newList中就装几条
                toIndex = listSize - i;
            }
            List newList = list.subList(i, i + toIndex);
            map.put("keyName" + keyToken, newList);
            keyToken++;
        }
        return map;
    }

改进

当in集合 集合长度特别长的时候 sql查询效率会非常低下,数据量特别大的时候不建议使用这种方式。

改进方式

新增部门横向拉伸表 把纵向循环迭代的部门表 水平横向拉伸 权限查询时使用连表查询的方式提高SQL查询效率
1.定时任务,从原表拉数据定时更新部门横向拉伸表
2.从BI大数据部门数据平台导数

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值