mysql分頁查詢總結

2021-09-14 02:56:54 字數 1926 閱讀 8711

mysql提供分頁的功能:

select * from table limit [offset,] rows | rows offset offset
limit子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)。下面,我們針對特例對mysql分頁查詢進行總結。

最簡單的用法就是:

select * from table limit ?,?
這種是最簡單的limit分頁查詢。配合where條件使用:

select * from table where column > ? order by id limit ?,?
上邊這種情況,建議在column和id建立復合索引比較好。

以上兩種情況,對於小資料量分頁查詢時,這樣的sql就足夠用了。但是對於百萬級以上的資料表,如果使用上邊的sql 的話,越往後limit語句的偏移量越來越大,查詢就會變得越來越慢。類似於:

select * from `user` where `cate`='陝西' order by id limit 100000,10
為了避免這種查詢,我們可以通過子查詢的方式來提高查詢效率。

select * from `user` where id >=(select * from `user` where `cate`='陝西' order by id limit 100000,1) and `cate`='陝西' limit 10
通過explain我們可以看出直接limit查詢和通過子查詢的差距:

直接limit查詢:
type

possible_keys

keykey_len

refrows

extra

all(null)

(null)

(null)

(null)

4076607

子查詢分頁查詢:
type

possible_keys

keykey_len

refrows

extra

primary

range

primary

primary

42038331

using where

subquery

index

(null)

primary

44076663

using index

可以看出,通過子查詢的方式,子查詢是在索引上進行的,而普通的查詢是在資料檔案上進行的。通常來說,索引檔案要比資料檔案小的多,所以操作索引檔案更直接高效。

此外,還可以通過join分頁方式

select * from `user` as t1 

join (select id from `user` order by id limit 100000, 1) as t2

where t1.id <= t2.id order by t1.id limit 10;

join分頁和子查詢分頁的效率基本在乙個等級上。(但是,子查詢需要在記憶體中建立臨時表,查詢完畢後,mysql需要撤銷這些臨時表。通過join可以避免這種情況)在分頁查詢前,可以進行判斷,如果是在限定頁數內,就使用基本分頁查詢,大於則使用子查詢分頁處理。

Mysql 分頁查詢 快照 Mysql分頁查詢優化

select from orders history where type 8 limit 1000,10 該條語句將會從表 orders history 中查詢offset 1000開始之後的10條資料,也就是第1001條到第1010條資料 1001 id 1010 資料表中的記錄預設使用主鍵 一...

mysql 分頁查詢 失效 mysql分頁查詢

比如每頁10條,分頁查詢 語法 select from table limit offset,rows offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目。初始行的偏移量是0 不是1 select from table limit 0,10 第一頁 select from t...

分頁查詢總結

select from select e.rownum rn from select from emp e a1 where a1.rn 6 and a1.rn 10 select from select a1.rownum rn from select from emp a1 where rown...