LIMIT
和OFFSET
关键字实现数据分页。MySQL数据库分页技术_分页
LIMIT和OFFSET分页法
1、基本语法:
SELECT * FROM table_name ORDER BY column_name LIMIT offset, count;
offset
表示偏移量,即从结果集的第几行开始返回数据。
count
是每页返回的行数。
2、示例:
获取第2页,每页显示10条记录:
“`sql
SELECT * FROM table_name ORDER BY column_name LIMIT 10 OFFSET 10;
“`
OFFSET FETCH分页法
1、基本语法:
SELECT * FROM table_name ORDER BY column_name OFFSET offset ROWS FETCH NEXT count ROWS ONLY;
OFFSET offset ROWS
指定偏移量。
FETCH NEXT count ROWS ONLY
指定返回的行数。
2、示例:
获取第2页,每页显示10条记录:
“`sql
SELECT * FROM table_name ORDER BY column_name OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
“`
ROW_NUMBER()分页法
1、基本语法:
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num FROM table_name) AS numbered_rows WHERE row_num BETWEEN offset + 1 AND offset + count;
ROW_NUMBER() OVER (ORDER BY column_name)
为结果集中的每一行分配一个序号。
WHERE row_num BETWEEN offset + 1 AND offset + count
筛选出指定页的数据。
2、示例:
获取第2页,每页显示10条记录:
“`sql
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num FROM table_name) AS numbered_rows WHERE row_num BETWEEN 11 AND 20;
“`
ROWNUM分页法(适用于Oracle)
1、基本语法:
SELECT * FROM (SELECT *, ROWNUM AS row_num FROM table_name WHERE ROWNUM <= offset + count ORDER BY column_name) WHERE row_num > offset;
ROWNUM
是Oracle中的伪列,表示返回的行号。
2、示例:
获取第2页,每页显示10条记录:
“`sql
SELECT * FROM (SELECT *, ROWNUM AS row_num FROM table_name WHERE ROWNUM <= 20 ORDER BY column_name) WHERE row_num > 10;
“`
MySQL特定分页方式
1、子查询分页:
通过子查询先对数据进行排序,然后再使用LIMIT进行分页。
“`sql
SELECT * FROM (SELECT * FROM table_name ORDER BY column_name) subquery LIMIT 10 OFFSET 10;
“`
2、存储过程分页:
创建一个存储过程,接受页码和每页记录条数等参数,在存储过程中进行分页查询。
“`sql
DELIMITER //
CREATE PROCEDURE pagination(IN page INT, IN pageSize INT)
BEGIN
SET @offset = (page 1) * pageSize;
SELECT * FROM table_name LIMIT @offset, pageSize;
END //
DELIMITER ;
“`
3、变量分页:
通过设置变量来实现分页。
“`sql
SET @page = 2;
SET @pageSize = 10;
SET @offset = (@page 1) * @pageSize;
SELECT * FROM table_name LIMIT @offset, @pageSize;
“`
分页优化方法
1、建立主键或唯一索引:
利用索引进行分页,速度会更快。
“`sql
SELECT * FROM table_name WHERE id_pk > (pageNum*10) LIMIT 10;
“`
2、基于索引再排序:
如果数据查询出来并不是按照主键排序,可以通过再次排序来确保结果集的稳定性。
“`sql
SELECT * FROM table_name WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT 10;
“`
3、利用prepare语句:
对于大数据量的分页,可以使用prepare语句提高查询速度。
“`sql
PREPARE stmt_name FROM ‘SELECT * FROM table_name WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT ?’;
EXECUTE stmt_name USING @pageNum, @pageSize, @offset;
“`
4、流式分页/游标分页:
对于时间线类的数据流,可以采用游标分页的方式,Twitter和Facebook的API设计中就使用了这种分页方式。
“`sql
SELECT * FROM news WHERE id < [min_id] limit per_page;
“`
FAQs常见问题解答
问题1:MySQL的分页查询在数据量较大时性能如何提升?
答:在数据量较大时,可以使用以下几种方法提升分页查询的性能:
1、建立主键或唯一索引:利用索引进行分页,速度会更快。
“`sql
SELECT * FROM table_name WHERE id_pk > (pageNum*10) LIMIT 10;
“`
2、基于索引再排序:如果数据查询出来并不是按照主键排序,可以通过再次排序来确保结果集的稳定性。
“`sql
SELECT * FROM table_name WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT 10;
“`
3、利用prepare语句:对于大数据量的分页,可以使用prepare语句提高查询速度。
“`sql
PREPARE stmt_name FROM ‘SELECT * FROM table_name WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT ?’;
EXECUTE stmt_name USING @pageNum, @pageSize, @offset;
“`
4、流式分页/游标分页:对于时间线类的数据流,可以采用游标分页的方式,Twitter和Facebook的API设计中就使用了这种分页方式。
“`sql
SELECT * FROM news WHERE id < [min_id] limit per_page;
“`
问题2:如何在MySQL中使用存储过程实现分页?
答:在MySQL中,可以通过创建存储过程来实现分页功能,以下是一个简单的示例:
1、创建存储过程:
“`sql
DELIMITER //
CREATE PROCEDURE pagination(IN page INT, IN pageSize INT)
BEGIN
SET @offset = (page 1) * pageSize;
SELECT * FROM table_name LIMIT @offset, pageSize;
END //
DELIMITER ;
“`
2、调用存储过程:
“`sql
CALL pagination(2, 10);
“`
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1100599.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复