数据库分页

1、SQL server

现在常用的是:

row_number()

--例如page=1,limit=10
--     // 开始索引
--  int start = (page - 1) * limit + 1;//(1)为2是结果为(11)
--// 结束索引
--int end = page * limit;//(10)为2是结果为(20)
select * from(select *, ROW_NUMBER() over (order by p.id desc) row from product p ) c 

where c.row>=start and c.row<=end

2、Mysql

---语句样式: MySQL中,可用如下方法:

SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
---适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,

使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
---原因: 索引扫描,速度会很快.

但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待...).

方式 1、limit m语句:

select * from product where id>(1*3) ORDER BY id ASC LIMIT 1
#通过ID查找 LIMIT M 后面参数是显示条数 

方式 2、limit m,m语句:

select * from product order by id desc limit 4,2;
#问题多 数据多的时候 效率十分低下 满足(4+2)后面的参数是返回条数
int start=(page-1)*limit;//开始
List<Product> products = new ArrayList<Product>();
Product product = null;
String sql = "select * from product order by pno limit ?,?";
return getList(sql,new Object[]{start,limit});

 方式 3、 优化方式1

例如:每页10条数据,当前是第10页,当前条目ID的最大值是109,最小值是100.
那么跳到第9页:
select * from dept where deptno<100 order by desc limit 0,10;

那么跳到第8页:
select * from dept where deptno<100 order by desc limit 10,10;

那么跳到第11页:
select * from dept where deptno>109 order by asc limit 0,10;

那么跳到第11页:
select * from dept where deptno>109 order by asc limit 10,10;

3、sqlite分页方式

 select * from (表名) order by (排序字段) limit (返回条数) offset (第几条开始);

4、MariaDB

原文地址:https://www.cnblogs.com/dzcici/p/9542513.html