mysql分頁查詢總結

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

相關文章
相關標籤/搜索