1. MyBatis-Plus分页机制原理解析
MyBatis-Plus作为MyBatis的增强工具,其分页功能通过Page对象和分页拦截器实现。核心原理是在SQL执行前拦截StatementHandler,根据分页参数自动改写原始SQL。默认实现会在SQL末尾追加LIMIT子句,同时执行COUNT查询获取总记录数。
分页拦截器(PaginationInnerInterceptor)的工作流程:
- 检测当前SQL是否需要分页(判断是否存在Page参数)
- 解析分页参数(current, size)
- 生成COUNT查询SQL并执行
- 修改原始SQL添加LIMIT条件
- 执行分页查询
- 封装结果到Page对象
重要提示:MyBatis-Plus 3.4.0+版本推荐使用新版分页拦截器,旧版PageInterceptor已标记为过时
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 性能瓶颈深度分析
2.1 COUNT查询性能问题
默认的COUNT(1)查询在百万级数据时可能产生明显延迟:
- 无索引字段条件时全表扫描
- 复杂联表查询时COUNT效率低下
- 大数据量下统计精确值代价高
实测案例:500万数据单表条件查询
- 无索引字段条件:COUNT执行耗时1.8s
- 有索引字段条件:COUNT执行耗时0.2s
2.2 分页偏移量效率问题
传统LIMIT分页在深度分页时性能急剧下降:
sql复制-- 页数越大性能越差
SELECT * FROM table LIMIT 1000000, 20
MySQL需要先扫描前100万条记录,再返回20条
2.3 不必要的数据传输
默认查询会返回实体所有字段,包括大文本字段等不必要数据
3. 六大核心优化方案
3.1 自定义COUNT查询优化
通过重写Page的optimizeCountSql方法实现:
java复制Page<User> page = new Page<>(1, 10){
@Override
public String optimizeCountSql() {
return "SELECT count(*) FROM (" + getOriginalSql() + ") temp_count";
}
}
