mysql分表分页

之前涛哥建议用代码拼接的方式去分表分页,而不是sql拼接(不要union,也不要list分页),我就这么做了,贴一下代码分享下,有点乱,有更好的建议欢迎提出:
详细代码参考(axxBank)com.aixuexi.axxBank.dao.IncomeRecordDetailDao#getActualAccountInfoByCondition

List<IncomeRecordDetailInfo> list = new ArrayList<IncomeRecordDetailInfo>();
DateFormat df = new SimpleDateFormat(DateConstant.FORMAT_PATTERN_YMD1);
List<String> dateList = FinaicialCommon.getDateArrayByDate(actualAccountParams.getStartDate(), actualAccountParams.getEndDate());//对接入的起始日期作处理,决定接下来要查哪些表
int startIndex = (pageBean.getPageNum() – 1) * pageBean. getPagesize();//分页的开始位置
int endIndex = pageBean.getPageNum() * pageBean.getPagesize();//分页的结束位置
int sum = 0,start,end;//sum(记录开始到当前的总结果数) start(limit的开始位置) end(limit的大小)
Map<String, Integer> mapCount = getIncomeCountList(actualAccountParams, dictionaryIds, dateList, df);//获取每个分表对应的结果数 以及总结果数 (key:dateString value:各分表的结果数)
for (int date = dateList.size() – 1; date >= 0; date –) {//默认按时间倒序
String dateString = dateList.get(date);
String tableIncomeString = new StringBuilder(“income_record_”).append(dateString).toString();//分表名
String tableAmountString = new StringBuilder(“amount_record_”).append(dateString).toString();//分表名
StringBuilder sb = 。。。。//对分表的sql查询,我就不贴代码了,可以到对应的代码处查看
if(isPage) {//是否需要分页()
int resultCount = mapCount.get(dateString) == null ? 0 : mapCount.get(dateString);//每次(每个分表)查询的结果数
/**以下是分表分页算法,用于拼接分表之后的分页查询结果**/
sum += resultCount;//记录当前的结果总数,用于分页拼接
if (sum >= startIndex) {//sum 当前的结果总数 startIndex 分页的开始位置
if (sum > endIndex) {//当前结果总数是否大于分页的结束位置(当前表已经满足分页请求了)
start = startIndex – (sum – resultCount) < 0 ? 0 : (startIndex – (sum – resultCount)); //计算查询当前表的开始位置 如果为负置为0
end = startIndex – (sum – resultCount) + pageBean.getPagesize();//查询当前表的结束位置
sb.append(” LIMIT “).append(start).append(“,”).append(end-start);//对当前表指定分页,分页大小直接pageSize也行
list.addAll(jdbcTemplate.query(sb.toString(), new IncomeRecordDetailMapper()));
break;
} else if (sum <= endIndex) {//当前结果总数小于 分页的结束位置(当前表不满足分页请求,拼接完当前表,则继续拼接下一个表)
start = (startIndex – (sum – resultCount)) < 0 ? 0 : (startIndex – (sum – resultCount));//当前表的开始位置 如果为负置0
end = resultCount; //当前表的结束位置,结束位置直接是当前表的总结果数
sb.append(” LIMIT “).append(start).append(“,”).append(end);//当前表指定分页
list.addAll(jdbcTemplate.query(sb.toString(), new IncomeRecordDetailMapper()));
}
}
}else {//不需要分页的话直接拼接所有结果
list.addAll(jdbcTemplate.query(sb.toString(),new IncomeRecordDetailMapper()));
}
}

《mysql分表分页》有5个想法

  1. 鼓励类似的分享!
    一些特定场景 实现方案有很多,总有一款巧妙的方案可以让问题迎刃而解。一个人的思维有限,希望大家多多分享集思广益。
    代码贴到上面 格式变了,建议从gerrit上面把axxBank项目clone下来,在开发工具里读这块代码会比较容易。

    1. 目前的情况是对分表的正序遍历和倒序遍历,拼接的时候再对单表排序(正序和倒序),只不过代码量大一点~

发表评论

电子邮件地址不会被公开。 必填项已用*标注