分页查询主要有两种形式:逻辑分页、物理分页。
1.逻辑分页
1.1 含义:一次性查出所有的数据,然后在代码逻辑中进行处理,根据页码和展示的数量决定具体显示哪几条数据
1.2 优点:查询效率快【直接从内存中读取】
1.3 局限性: 占用大量内存,降低服务器的性能
2. 物理分页【推荐使用】
2.1 含义:根据数据库提供的分页功能查询出需要显示的具体数据【即:只查询当前页面显示的数据】
2.2 优点: 不影响服务器性能
2.3 局限性: 查询速率相对较慢【每次翻页都需要与数据库进行交互】
2.4 Oracle实现:
SELECT * FROM ( SELECT ROWNUM AS NUM, T.* FROM ( SELECT * FROM T_USER ORDER BY ID ) T WHERE ROWNUM <= endIndex) WHERE NUM > startIndex
2.4.1 原理: 三层嵌套查询 + ROWNUM
2.4.2 三层嵌套查询的作用及原因:(由内向外)
|
作用 |
原因 |
第一层 |
排序 |
ORDER BY不能放在WHERE前面 |
第二层 |
取endindex条记录,并将ROWNUM变为实际显示列 |
ROWNUM为隐藏列,不支持 >或 >= |
第三层 |
截取需要的子集 |
获取最终结果集 |
2.5 MySql实现
SELECT * FROM actor ORDER BY first_name LIMIT startIndex,pageSize
3. 补充
3.1 子查询效率低,尽量减少子查询的使用
例如:Oracle分页可以做以下优化
3.1.1 不需要排序,查询第一页
SELECT * FROM T_USER ROWNUM < endIndex
3.1.2 不需要排序,查询后面几页
SELECT * FROM ( SELECT ROWNUM AS NUM, T.* FROM T_USER T WHERE ROWNUM < endIndex) WHERE NUM > startIndex
3.1.3 需要排序,查询第一页
SELECT * FROM ( SELECT * FROM T_USER ORDER BY ID ) WHERE ROWNUM <= endIndex
3.1.4 需要排序,查询后面几页
SELECT * FROM ( SELECT ROWNUM AS NUM, T.* FROM ( SELECT * FROM T_USER ORDER BY ID ) T WHERE ROWNUM <= endIndex) WHERE NUM > startIndex
3.2 推荐使用物理查询的原因:
3.2.1 逻辑分页查询一次性将数据全部读到内存中,占用大量的系统资源(尤其是数据很多的时候),影响其他软件的使用,降低服务器的性能
3.2.2 物理分页查询只是在翻页的时候速率较慢,但是翻页操作使用并不频繁,相对于逻辑查询降低服务器性能,该影响基本可以忽略