mysql limit分頁用法講解


1.情景展示

在Oracle當中,使用rownum來進行分頁;

而在mysql中,是沒有rownum的,需要通過limit來實現。

2.用法介紹

limit [offset,]rows

limit后面可以跟一個參數,也可以跟兩個參數;

格式一:

limit rows

rows代表行數,表示:獲取前rows行數據。

等價於:

limit 0, rows

格式二:

limit offset,rows

offset代表偏移量,rows代表行數,表示:獲取偏移量后面的rows行數據,相當於查詢的是:

offset<rownum≤rows

或offset+1≤rownum≤rows。

偏移量的初始值為0(不是1),這就是可以解釋,為什么格式一當中的兩種方式一樣的原因啦。

舉例子:

-- 獲取表前5行數據
SELECT 1 FROM meta_theme ORDER BY THEMEID LIMIT 5;
SELECT 1 FROM meta_theme ORDER BY THEMEID LIMIT 0,5;

 獲取第6-10行數據

分析:

6-10行,也就是10-6+1=5,共5行數據;

由於limit第一個參數的偏移量不在查詢范圍內,所以,要想第6行包含在內,需要:6-1=5。

使用limit的問題,就在進行分頁查詢的時候,有點繞。

知道了limit偏移量的特性之后,我們可以發現:

要想,將第一行數據包含在內,就需要限制limit的第一個參數值必須為0;

否則的話,我們進行分頁時,將會將以第一條數據遺漏,比方說:

分頁雖然從數量量沒有錯,但是,此時已經將第一條數據排除在外了。

所以,需要保證,limit的第一頁數據包含第一行記錄,也就是limit需要從0開始。

LIMIT (pageIndex-1)*pageSize, pageSize

pageSize起始值為1。

注意事項:

limit 后面只能跟數字,不能跟其它

-- 錯誤用法1:limit后面跟 字符串轉數字函數
LIMIT CAST('10' AS SIGNED)
-- 錯誤用法2:limit后面跟 數字計算
LIMIT 20-10

3.性能分析

基本用法

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

在中小數據量的情況下,這樣的SQL足夠用了;

我們可以使用了復合索引來提升查詢速度(where的限制條件與order by的排序條件組合成聯合索引);

SELECT THEMEID,2 test FROM meta_theme where STATUS=1 ORDER BY THEMEID LIMIT 0,5;

在這里,為了提升查詢速度,我們就可以給字段STATUS+THEMEID,創建索引。

PS:表主鍵是唯一索引。

子查詢分頁

隨着數據量的增加,頁數會越來越多,越往后分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢;

可以通過子查詢的方式來提高分頁效率。

-- 查詢第10001-10010條數據
SELECT
	THEMENAME,
	THEMECODE 
FROM
	meta_theme 
WHERE
	THEMEID >= ( SELECT THEMEID FROM meta_theme WHERE THEMELEVEL = 5 ORDER BY THEMEID LIMIT 10000, 1 ) 
	LIMIT 10

自連接

也可以通過自連接的方式來提高分頁效率。

SELECT t1.THEMEID, THEMENAME, THEMECODE FROM meta_theme t1,( SELECT THEMEID FROM meta_theme ORDER BY THEMEID DESC LIMIT 10, 1 ) t2 
WHERE
	t1.THEMEID < t2.THEMEID 
ORDER BY
	t1.THEMEID DESC 
	LIMIT 10;

小結:

可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內,就使用最基本的分頁方式,大於一百頁,則使用子查詢的分頁方式。 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM