mybatis-flex / mybatis-flex

mybatis-flex is an elegant Mybatis Enhancement Framework
https://mybatis-flex.com
Apache License 2.0
1.86k stars 174 forks source link

性能测试问题 #339

Open AuroraLove opened 4 months ago

AuroraLove commented 4 months ago

1.拉取过了测试性能demo的案例,经过测试确实性能优于mybatisplus 2.准备将现有项目工程切入flex,根据文档说明,某一具体业务类切成flex的实现,发现并没有demo案例出现的性能差异效果,结果均弱于plus 3.测试说明:本地测试环境,postgresql数据库,springboot2.5.3,jdk11,flex版本:1.8.9,mybatisplus 版本:3.5.3,pagehelper:1.4.3;主要测试分页查询性能,所有环境均一致,仅切换了ORM框架 4.测试数据:单表录入模拟数据 14460039 5.测试结果: a>plus: image b>flex: image 10次测试结果均于上图类似不再过多展示 6.相关测试用例代码: flex: image

....................... log.info("----------------start2----------------------------"); long currentTimeMillis = System.currentTimeMillis(); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.select(ACTION.DEFAULT_COLUMNS).from(ACTION); queryWrapper.and(ACTION.ID.eq(filter.getId(),If::hasText)); queryWrapper.and(ACTION.ID.in(filter.getIds(),If::isNotEmpty));

    if (ObjectUtils.isNotEmpty(filter.getUser())){
        queryWrapper.and(ACTION.USER_ID.eq(filter.getUser().getId(), If::hasText));
    }
    queryWrapper.and(ACTION.USER_ID.in(filter.getUserIds(), If::isNotEmpty));

    if (ObjectUtils.isNotEmpty(filter.getPos())){
        queryWrapper.and(ACTION.POS_ID.eq(filter.getPos().getId(), If::hasText));
        if (ObjectUtils.isNotEmpty(filter.getPos().getType())) {
            queryWrapper.and(ACTION.POS_OTYPE.eq(filter.getPos().getType().getOtid(), If::notNull));
        }
    }
    if (ObjectUtils.isNotEmpty(filter.getObj())){
        queryWrapper.and(ACTION.OBJ_ID.eq(filter.getObj().getId(), If::hasText));
        if (ObjectUtils.isNotEmpty(filter.getObj().getType())){
            queryWrapper.and(ACTION.OBJ_TYPE.eq(filter.getObj().getType().getOtid(), If::notNull));
        }
        if (ObjectUtils.isNotEmpty(filter.getObj().getName())){
            queryWrapper.and(ACTION.OBJ_NAME.like(filter.getObj().getName(), If::hasText));
        }
    }
    if (ObjectUtils.isNotEmpty(filter.getKeyword())) {
        queryWrapper.and(ACTION.OBJ_NAME.like(filter.getKeyword()).or(ACTION.RESULT_NAME.like(filter.getKeyword())));
    }
    queryWrapper.and(ACTION.OBJ_ID.in(objIds,If::isNotEmpty));

    if (ObjectUtils.isNotEmpty(filter.getEquals())
            || ObjectUtils.isNotEmpty(filter.getRanges())
            || ObjectUtils.isNotEmpty(filter.getContains())) {
        String jsonbQuery = filter.toJsonbSql().toSql();
        if (ObjectUtils.isNotEmpty(jsonbQuery)){
            queryWrapper.and(jsonbQuery);
        }
    }
    if (ObjectUtils.isNotEmpty(filter.getResult())){
        queryWrapper.and(ACTION.RESULT_ID.eq(filter.getResult().getId(), If::hasText));
        if (ObjectUtils.isNotEmpty(filter.getResult().getType())){
            queryWrapper.and(ACTION.RESULT_TYPE.eq(filter.getResult().getType().getOtid(), If::notNull));
        }
        if (ObjectUtils.isNotEmpty(filter.getResult().getName())){
            queryWrapper.and(ACTION.RESULT_NAME.like(filter.getResult().getName(), If::hasText));
        }
    }
    queryWrapper.and(ACTION.CREATE_TIME.ge(filter.getStartTime(),If::notNull));
    queryWrapper.and(ACTION.CREATE_TIME.le(filter.getEndTime(),If::notNull));
    queryWrapper.and(ACTION.ACTION_TYPE_ID.eq(filter.getActionTypeId(),If::notNull));
    queryWrapper.and(ACTION.ACTION_TYPE_ID.in(filter.getActionTypeIds(),If::isNotEmpty));
    queryWrapper.orderBy(ACTION.UPDATE_TIME.desc());

    Page<ActionPO> pageRequest = page(new Page<>(filter.getPageNum(),filter.getPageSize()),queryWrapper);
    log.info("list2 10-->:{}", System.currentTimeMillis() - currentTimeMillis);

plus: image log.info("----------------start----------------------------"); long currentTimeMillis = System.currentTimeMillis(); Page pageRequest = SqlBuilders.page(filter); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); if (ObjectUtils.isNotEmpty(filter.getUser())){ lambdaQueryWrapper.eq(ActionPO::getUserId,filter.getUser().getId()); } if (ObjectUtils.isNotEmpty(filter.getId())){ lambdaQueryWrapper.eq(ActionPO::getId,filter.getId()); } if (ObjectUtils.isNotEmpty(filter.getIds())){ lambdaQueryWrapper.in(ActionPO::getId,filter.getIds()); } if (ObjectUtils.isNotEmpty(filter.getUserIds())) { lambdaQueryWrapper.in(ActionPO::getUserId, filter.getUserIds()); } if (ObjectUtils.isNotEmpty(filter.getPos())){ lambdaQueryWrapper.eq(ActionPO::getPosId,filter.getPos().getId()); if (ObjectUtils.isNotEmpty(filter.getPos().getType())) { lambdaQueryWrapper.eq(ActionPO::getPosOtype, filter.getPos().getType().getOtid()); } } if (ObjectUtils.isNotEmpty(filter.getObj())){ lambdaQueryWrapper.eq(ActionPO::getObjId,filter.getObj().getId()); if (ObjectUtils.isNotEmpty(filter.getObj().getType())){ lambdaQueryWrapper.eq(ActionPO::getObjType,filter.getObj().getType().getOtid()); } if (ObjectUtils.isNotEmpty(filter.getObj().getName())){ lambdaQueryWrapper.like(ActionPO::getObjName,filter.getObj().getName()); } } if (ObjectUtils.isNotEmpty(filter.getKeyword())) { lambdaQueryWrapper .like(ActionPO::getObjName, filter.getKeyword()) .or() .like(ActionPO::getResultName, filter.getKeyword()) ; } if (ObjectUtils.isNotEmpty(objIds)){ lambdaQueryWrapper.in(ActionPO::getObjId,objIds); } if (ObjectUtils.isNotEmpty(filter.getEquals()) || ObjectUtils.isNotEmpty(filter.getRanges()) || ObjectUtils.isNotEmpty(filter.getContains())) { String jsonbQuery = filter.toJsonbSql().toSql(); if (ObjectUtils.isNotEmpty(jsonbQuery)){ lambdaQueryWrapper.apply(jsonbQuery); } } if (ObjectUtils.isNotEmpty(filter.getResult())){ lambdaQueryWrapper.eq(ActionPO::getResultId,filter.getResult().getId()); if (ObjectUtils.isNotEmpty(filter.getResult().getType())){ lambdaQueryWrapper.eq(ActionPO::getResultType,filter.getResult().getType().getOtid()); } if (ObjectUtils.isNotEmpty(filter.getResult().getType())){ lambdaQueryWrapper.eq(ActionPO::getResultType,filter.getResult().getType().getOtid()); } if (ObjectUtils.isNotEmpty(filter.getResult().getName())){ lambdaQueryWrapper.like(ActionPO::getResultName,filter.getResult().getName()); } } if (ObjectUtils.isNotEmpty(filter.getStartTime())){ lambdaQueryWrapper.ge(ActionPO::getCreateTime,filter.getStartTime()); } if (ObjectUtils.isNotEmpty(filter.getEndTime())){ lambdaQueryWrapper.le(ActionPO::getCreateTime,filter.getEndTime()); } if (ObjectUtils.isNotEmpty(filter.getActionTypeId())){ lambdaQueryWrapper.eq(ActionPO::getActionTypeId,filter.getActionTypeId()); } if (ObjectUtils.isNotEmpty(filter.getActionTypeId())){ lambdaQueryWrapper.eq(ActionPO::getActionTypeId,filter.getActionTypeId()); } if (ObjectUtils.isNotEmpty(filter.getActionTypeIds())){ lambdaQueryWrapper.in(ActionPO::getActionTypeId,filter.getActionTypeIds()); } lambdaQueryWrapper.orderByDesc(ActionPO::getUpdateTime); List actionPOS = list(lambdaQueryWrapper); log.info("list 10-->:{}", System.currentTimeMillis() - currentTimeMillis);

weirhp commented 4 months ago

框架本身支持分页,不用pagehelper,再测试一下看看呢。我也想了解性能怎么样。

203579397 commented 4 months ago

希望吸纳PageHelper的分页设计模式