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;
小結:
可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內,就使用最基本的分頁方式,大於一百頁,則使用子查詢的分頁方式。