mybatis用pagehelper 然后用CountJSqlParser45,发现自己手写的mapper查询效率很慢

如题

效率慢

分页查询,发现效率很慢,然后发现是比较复杂的sql,CountJSqlParser45它不会帮忙优化掉,就是select多少字段它count的时候也还是这么多字段

框架里的用法是这样的

所以去看了CountJSqlParser45里面的代码,发现如果有group之类的,它就不帮忙把count优化一下,直接在外面套了一层count(0)

知道问题之后就是覆盖这个方法,所以在自己的下面新建了一个同路径同名的覆盖它

原来的代码是发现不是简单sql就直接不处理了,现在的逻辑是发现是PlainSelect但是不是isSimpleCount的情况下,把查询里面的select的普通字段都去除掉,新写了cleanSimpleField这个方法

逻辑很简单,如果是比较复杂的字段还留着,因为可能会影响结果,比如函数啊别名啊之类的,但是如果只是简单的字段都去掉,如果发现都是简单字段,那么直接用1来代替

c 复制代码
    public List<SelectItem> cleanSimpleField(PlainSelect select){

        //因为查询太多的话会导致速度很慢,所以移除掉普通的字段,把肯能影响结果的字段留下来
        List<SelectItem> newSelectItems =new ArrayList<>();

        //遍历原来的select 然后把需要的留下
        for (SelectItem item : select.getSelectItems()) {
            //select列中包含参数的时候不可以去掉,否则会引起参数个数错误
            if (item.toString().contains("?")) {
                newSelectItems.add(item);
            }
            //如果查询列中包含函数,也不可以,函数可能会聚合列
            if (item instanceof SelectExpressionItem) {
                Expression expression = ((SelectExpressionItem) item).getExpression();
                if (expression instanceof Function) {
                    String name = ((Function) expression).getName();
                    if (name != null) {
                        String NAME = name.toUpperCase();
                        if (skipFunctions.contains(NAME)) {
                            //go on
                        } else if (falseFunctions.contains(NAME)) {
                            newSelectItems.add(item);
                        } else {
                            for (String aggregateFunction : AGGREGATE_FUNCTIONS) {
                                if (NAME.startsWith(aggregateFunction)) {
                                    falseFunctions.add(NAME);
                                    newSelectItems.add(item);
                                }
                            }
                            skipFunctions.add(NAME);
                        }
                    }
                } else if (expression instanceof Parenthesis && ((SelectExpressionItem) item).getAlias() != null) {
                    //#555,当存在 (a+b) as c 时,c 如果出现了 order by 或者 having 中时,会找不到对应的列,
                    // 这里想要更智能,需要在整个SQL中查找别名出现的位置,暂时不考虑,直接排除
                    newSelectItems.add(item);
                }
            }
        }

        //都是简单的都被去掉了,那么就把原来的第一个拿来
        if (ObjectUtil.isEmpty(newSelectItems)){
            newSelectItems.add(new SelectExpressionItem(new Column("1")));
        }

        return newSelectItems;
    }

疑惑

照理说LocalMySqlDialect里面改成自己的新的类,不是CountJSqlParser45应该也行的,但是不知道为什么我把CountJSqlParser45改成自己新写的类不行,所以只能用覆盖的方式了

c 复制代码
this.countSqlParser = ClassUtil.newInstance(properties.getProperty("countSqlParser"), CountSqlParser.class, properties, CountJSqlParser45::new);
//改成下面这个不知道为什么不行
```c
this.countSqlParser = ClassUtil.newInstance(properties.getProperty("countSqlParser"), CountSqlParser.class, properties, MyCountJSqlParser45::new);
复制代码
相关推荐
毕业设计7031 天前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
程序员JerrySUN2 天前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
linmengmeng_13142 天前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
vx_BS813302 天前
【项目编号:project51381】Spring Boot 婚纱摄影管理系统:套餐预约、在线咨询、支付与客片展示的一站式业务实现
java·spring boot·eclipse·tomcat·mybatis
jaysee-sjc3 天前
【苍穹外卖】Day01:从零认识企业级项目开发
java·开发语言·数据库·mysql·spring·intellij-idea·mybatis
程序猿乐锅3 天前
【黑马点评 | 第二篇】Redis 缓存更新策略与商铺缓存实现
java·网络·redis·spring·mybatis
萧瑟余晖3 天前
MyBatis 核心原理详解
架构·mybatis
MZA6664 天前
实战:基于 XXL-JOB + 策略模式 + Nacos 配置化的 CSV 导出任务系统设计
java·spring boot·mybatis
干到60岁退休的码农6 天前
15.创建获取用户接口与JWT认证器
java·spring boot·mybatis
干到60岁退休的码农6 天前
16.过滤器中处理异常响应返回
java·spring boot·mybatis