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