MySQL使用LIMIT分页查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pan_junbiao/article/details/85993616

当数据表中的记录越来越多的时候,可以通过分页查询的方法,对数据进行筛选,仅返回当前页面所需的数据内容。LIMIT是MySQL中的一个特殊关键字。LIMIT子句可以对查询结果的记录条数进行限定,控制它输出的行数。

下面以MySQL提供的测试库sakila中的actor表为示例,实现actor表的分页查询。

1、方式一:使用一般分页查询(不推荐

-- 方式一:分页查询存储过程
DROP PROCEDURE IF EXISTS proc_page;
CREATE PROCEDURE proc_page(IN page_index INT,IN page_size INT)
BEGIN
		DECLARE begin_no INT;
		SET begin_no = (page_index-1)*page_size;

		SELECT * FROM actor
		ORDER BY actor_id ASC
		LIMIT begin_no,page_size;
END;

-- 调用存储过程:查询第2页,每页10条记录
CALL proc_page(2,10);

弊端:方式一虽然实现了分页功能,但随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间将急剧增加。这种分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢,而且查询的数据越多,也会拖慢总查询速度。

2、方式二:使用子句优化查询(推送)

-- 方式二:分页查询存储过程
DROP PROCEDURE IF EXISTS proc_optimize;
CREATE PROCEDURE proc_optimize(IN page_index INT,IN page_size INT)
BEGIN
		DECLARE begin_no INT;
		SET begin_no = (page_index-1)*page_size;

		SELECT * FROM actor
		WHERE actor_id >= (
			SELECT actor_id FROM actor
			ORDER BY actor_id ASC
			LIMIT begin_no,1
		)
		ORDER BY actor_id ASC
		LIMIT page_size;
END;

-- 调用存储过程:查询第2页,每页10条记录
CALL proc_optimize(2,10);

方式二适合数据表的id是连续递增的,则可以根据查询的页数和查询的记录数可以算出查询的id的范围。这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id的情况,不过一般建立表的时候,都会添加基本的自增的主键id字段,这为分页查询带来很多便利。

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/85993616