1. 程式人生 > >MySQL使用LIMIT分頁查詢

MySQL使用LIMIT分頁查詢

當資料表中的記錄越來越多的時候,可以通過分頁查詢的方法,對資料進行篩選,僅返回當前頁面所需的資料內容。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欄位,這為分頁查詢帶來很多便利。