1. 程式人生 > >MySql實現分頁查詢的SQL,mysql實現分頁查詢的sql語句

MySql實現分頁查詢的SQL,mysql實現分頁查詢的sql語句

refs:

http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430

摘要: MySQL資料庫實現分頁查詢的SQL語句寫法!

一:分頁需求:

客戶端通過傳遞start(頁碼),limit(每頁顯示的條數)兩個引數去分頁查詢資料庫表中的資料,那我們知道MySql資料庫提供了分頁的函式limit m,n,但是該函式的用法和我們的需求不一樣,所以就需要我們根據實際情況去改寫適合我們自己的分頁語句,具體的分析如下:

比如:

查詢第1條到第10條的資料的sql是:select * from table limit 0,10;   ->對應我們的需求就是查詢第一頁的資料:select * from table limit (1-1)*10,10;

查詢第10條到第20條的資料的sql是:select * from table limit 10,20;  ->對應我們的需求就是查詢第二頁的資料:select * from table limit (2-1)*10,10;

查詢第20條到第30條的資料的sql是:select * from table limit 20,30;  ->對應我們的需求就是查詢第三頁的資料:select * from table limit (3-1)*10,10;

二:通過上面的分析,可以得出符合我們自己需求的分頁sql格式是:

select * from table limit (start-1)*limit,limit; 其中start是頁碼,limit是每頁顯示的條數。

三:當資料較多時

對上面的mysql語句說明:limit 10000,20的意思掃描滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡,如果是limit 100000,100,需要掃描100100行,在一個高併發的應用裡,每次查詢需要掃描超過10W行,效能肯定大打折扣。文中還提到limit n效能是沒問題的,因為只掃描n行。

第二部分:根據雅虎的幾位工程師帶來了一篇Efficient Pagination Using MySQL的報告內容擴充套件:在文中提到一種clue的做法,給翻頁提供一些線索,

比如還是SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是10020,最小的是10000,

如果我們只提供上一頁、下一頁這樣的跳轉(不提供到第N頁的跳轉),那麼:

下頁:從id=10021~10040這頁,程式碼如下:

SELECT * FROM message WHERE id>10020 ORDER BY id ASC LIMIT 20;

上頁:從id=9980~10000這頁,SQL語句可以是:

SELECT * FROM message WHERE id<10000 ORDER BY id DESC LIMIT 20;

不管翻多少頁,每次查詢只掃描20行。


解決大資料量翻頁問題

1、將LIMIT M,N的查詢改為LIMIT N
例如,使用LIMIT 10000,20,Mysql將需要讀取前10000行,然後獲取後面的20行 ,這是非常低效的,使用LIMIT N的方式,通過每頁第一條或最後一條記錄的id來做條件篩選,再配合降序和升序獲得上/下一頁的結果集 。
2、限制使用者翻頁數量
產品實際使用過程中使用者很少關心搜尋結果的第1萬條資料。
3、使用延時關聯通過使用覆蓋索引來查詢返回需要的主鍵,再根據返回的主鍵關聯原表獲得需要的行,這樣可以減少Mysql掃描那些需要丟棄的行數。

例項:
使用索引(sex,rating)進行查詢:

mysql> SELECT<cols>FROM profiles INNER JOIN( SELECT<primarykey cols> FROMprofiles WHEREx.sex='M' ORDER BY rating LIMIT 100000, 10  ) ASx USING(<primarykey cols>);