我有一个方法是分页获取用户,方法如下:
PageHelper.startPage(pageNumber, pageSize);
List<UserPageResponse> userPageResponseList = userMapper.findBy(some condition);
return new PageInfo<>(userPageResponseList);
userMapper.findBy
对应的 SQL 语句如下:
SELECT u.id,
u.name,
total_consumption_times, # 复杂的 count
total_consumption_amount, # 复杂的 sum
u.last_consumption_time
FROM user u
where ...
order by u.create_time desc;
我期望它产生的 count 语句是:
SELECT count(0)
FROM (SELECT 0
FROM user u
where ...) table_count;
但实际它产生的 count 语句如下,导致执行时间很长。
SELECT count(0)
FROM (SELECT u.id,
u.name,
total_consumption_times, # 复杂的 count
total_consumption_amount, # 复杂的 sum
u.last_consumption_time
FROM user u
where ...) table_count;
怎么解决这个问题?🤕
一个相关的 issue:1.3.1 版本 count 问题 · Issue #121 · pagehelper/pagehelper-spring-boot
解决方法:手写 count 查询,具体怎么操作可以查看Mybatis-PageHelper/Changelog.md at master · pagehelper/Mybatis-PageHelper - 5.0.4 - 2017-08-01
1
xiaowei0823 2022-03-17 23:27:44 +08:00 via iPhone
导致时间很长的是 select * 而不是 select count(0) from select 吗?
|
2
taogen 2022-03-17 23:39:13 +08:00 via Android
蹲一个答案
|
3
pelloz 2022-03-17 23:47:24 +08:00
像这样的框架问题,你一下没法修复或者换框架,那么你直接自己写一个 count 的 mapper ,先按自己正确的方法获取 count ,然后指定 page 的时候不要 count 就行了。我要是你,就换 mybatis-plus 了...
|
4
xuanbg 2022-03-18 06:44:44 +08:00
mybatis-plus 也不能解决 PageHelper 的这个 count 问题吧?正确的做法就是在有复杂查询的时候,抛开 PageHelper 自己写一个查询 count 的方法。PageHelper 只用在简单查询上面。
|
5
jorneyr 2022-03-18 06:54:25 +08:00
我不喜欢用这些插件,都是直接多写一个 SQL 。
|
6
JasonLaw OP @xiaowei0823 #1 导致时间很长是因为内嵌的 select 包含复杂的聚合运算。
|
8
agzou 2022-03-18 09:24:08 +08:00
手动分页
|
9
justNoBody 2022-03-18 09:40:55 +08:00 1
|
10
JasonLaw OP @justNoBody #9 我刚刚找到了,THX ,准备等一下整理到附言那里。
|
13
silentsky 2022-03-18 17:37:19 +08:00
很简单 不要统计总页数
PageHelper.startPage(pageNumber, pageSize, Boolean.FALSE); |