mysql分頁查詢總結
mysql提供分頁的功能:mysql
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT子句能夠被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。若是給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)。下面,咱們針對特例對mysql分頁查詢進行總結。 sql
最簡單的用法就是:spa
select * from table limit ?,?
這種是最簡單的limit分頁查詢。配合where條件使用:code
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查詢和經過子查詢的差距:it
直接limit查詢:
type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|
ALL | (NULL) | (NULL) | (NULL) | (NULL) | 4076607 |
子查詢分頁查詢:
type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|
PRIMARY | range | PRIMARY | PRIMARY | 4 | 2038331 | Using where |
SUBQUERY | index | (NULL) | PRIMARY | 4 | 4076663 | Using index |
能夠看出,經過子查詢的方式,子查詢是在索引上進行的,而普通的查詢是在數據文件上進行的。 一般來講,索引文件要比數據文件小的多,因此操做索引文件更直接高效。table
此外,還能夠經過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能夠避免這種狀況)在分頁查詢前,能夠進行判斷,若是是在限定頁數內,就使用基本分頁查詢,大於則使用子查詢分頁處理。select