mysql分頁道理和高效力的mysql分頁查詢語句。本站提示廣大學習愛好者:(mysql分頁道理和高效力的mysql分頁查詢語句)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql分頁道理和高效力的mysql分頁查詢語句正文
之前我在mysql平分頁都是用的 limit 100000,20如許的方法,我信任你也是吧,然則要進步效力,讓分頁的代碼效力更高一些,更快一些,那我們又該怎樣做呢?
第一部門:看一下分頁的根本道理:
mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)
對下面的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最年夜的是1020,最小的是1000,假如我們只供給上一頁、下一頁如許的跳轉(不供給到第N頁的跳轉),那末在處置上一頁的時刻SQL語句可所以:
SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;//下一頁
處置下一頁的時刻SQL語句可所以:
SELECT * FROM message WHERE id<1000 ORDER BY id DESC LIMIT 20;//上一頁
不論翻若干頁,每次查詢只掃描20行。
缺陷是只能供給上一頁、下一頁的鏈接情勢,然則我們的產物司理異常愛好“上一頁 1 2 3 4 5 6 7 8 9 下一頁”如許的鏈接方法,怎樣辦呢?
假如LIMIT m,n弗成防止的話,要優化效力,只要盡量的讓m小一下,我們擴大後面的clue做法,照樣SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,以後是第10頁,以後頁條目id最年夜的是2519,最小的是2500;
當是第10頁的SQL以下:
SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20
好比要跳到第9頁,SQL語句可以如許寫:
SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 0,20
好比要跳到第8頁,SQL語句可以如許寫:
SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 20,20
好比要跳到第7頁,SQL語句可以如許寫:
SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 40,20
跳轉到第11頁:
SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20
跳轉到第12頁:
SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20
跳轉到第13頁:
SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20
道理照樣一樣,記載住以後頁id的最年夜值和最小值,盤算跳轉頁面和以後頁絕對偏移,因為頁面鄰近,這個偏移量不會很年夜,如許的話m值絕對較小,年夜年夜削減掃描的行數。其實傳統的limit m,n,絕對的偏移一向是第一頁,如許的話越翻到前面,效力越差,而下面給出的辦法就沒有如許的成績。
留意SQL語句外面的ASC和DESC,假如是ASC掏出來的成果,顯示的時刻記得顛倒一下。
已在60W數據總量的表中測試,後果異常顯著