问题描述
在具体业务中,使用shardingJDBC 4.1.1将库存表进行了分表处理。业务需求需要通过group by函数查询一个维度的数据。但是在SQL写完之后,发现返回的Total总数为0,但是实际上在逻辑库中不是0。
问题原因
查询执行日志,发现SQL查询并未走分片逻辑,并未查询逻辑表数据,导致总数查询为0
具体原因:
1、PageHelper在进行分页查询的时候,会通过改写查询SQL自动进行tatol总数的查询。例如:SELECT XXX,YYY FROM [TABLE_NAME] GROUP BY XXX,YYY,PageHelper在查询的时候会自动生成一个_COUNT后缀的Mapper,将其转换为SELECT COUNT(0) FROM (SELECT XXX,YYY FROM [TABLE_NAME] GROUP BY XXX,YYY)的形式去查询总数;
2、shardingJDBC4.1.1并不支持复杂子查询。【看了下shardingJDBC官网的使用限制,指出shardingJDBC5.x使用了Federation执行引擎,可以支持更多复杂操作】
解决方案
1、既然PageHelper会自动改写SQL查询总数导致shardingJDBC无法正确解析,那我们就不走PageHelper的自动总数查询。设置PageHelper.startPage(1,20,false),不进行总数查询。自行手写sql进行总数查询
2、将涉及GROUP BY 的复杂子查询转换查询方式,使用DISTINCT方法。例如:SELECT COUNT(DISTINCT XXX,YYY) FROM [TABLE_NAME]。但是需要注意添加索引,不然会有一定的性能影响。
另一种解决方案:
将shardingJDBC升级到5.x,使其使用Federation执行引擎,支持复杂子查询。(这种还没验证,可自行验证)