前言
在平时我们写分页列表的时候,通常对于单表的分页,通过Mybatis分页插件结合Mysql的limit分页轻松完成单表的分页,但是也难免遇到多表的情况,多表需要对数据进行处理,合并、分组、排序、然后在进行分页查看,单纯的依靠分页插件和简单的limit的是无法实现的,也是相对于比较考验性能的一个接口,复杂的逻辑处理可能会对接口性能产生影响。
数据量大的情况下,对于分页性能的要求会更加高,如果分页查询不正确,会导致性能下降,严重直接会导致页面卡死,之前也是遇到过。
Mysql 单表分页
其实mysql的分页还是分很多种的,常见limit,还有子查询的方式进行limit、JOIN分页方式,这几种我都想大概说下,很多时候我可能对这种相对于简单的东西不太在乎,但是往往存在性能隐患。
limit
LIMIT * OFFSET *,用于返回select查询记录数,limit第一个参数来设定记录行的偏移量,也就是从第几行开始进行遍历拿数据,第二个参数来设定每次返回多少行数据,⚠️记录行的偏移量是从0开始的,不是1;
limit m,n ,一般m是page−1)∗page-1)*page−1)∗pagesize ,当前页-1乘以每页条数;
//返回 6-15行的数据 ,需要尽量减少m的值
SELECT * FROM table LIMIT 5,10;
//返回前5条数据,limit 5 = limit 0,5
SELECT * FROM table LIMIT 5
//每次查询获取上一页的最大id,无需扫描之前的数据 ,需要尽量减少m的值
select * from table where id > max_id order by id limit n;
//join 分页 通过关联子查询进行分页
SELECT * FROM `table` AS t1
JOIN (SELECT id FROM `table` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2
WHERE t1.id