高效的mysql分頁辦法及道理。本站提示廣大學習愛好者:(高效的mysql分頁辦法及道理)文章只能為提供參考,不一定能成為您想要的結果。以下是高效的mysql分頁辦法及道理正文
起首看一下分頁的根本道理:
mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G ***************** 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)
limit 10000,20的意思掃描知足前提的10020行,扔失落後面的10000行,前往最初的20行,成績就在這裡,假如是limit 100000,100,須要掃描100100行,在一個高並發的運用裡,每次查詢須要掃描跨越10W行,機能確定年夜打扣頭。文中還提到limit n機能是沒成績的,由於只掃描n行。
文中提到一種”clue”的做法,給翻頁供給一些”線索”,好比照樣SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,以後是第10頁,以後頁條目id最年夜的是9527,最小的是9500,假如我們只供給”上一頁”、”下一頁”如許的跳轉(不供給到第N頁的跳轉),那末在處置”上一頁”的時刻SQL語句可所以:
SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;
處置”下一頁”的時刻SQL語句可所以:
SELECT * FROM message WHERE id < 9500 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最年夜的是9527,最小的是9500,好比要跳到第8頁,我看的SQL語句可以如許寫:
SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;
跳轉到第13頁:
SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;
道理照樣一樣,記載住以後頁id的最年夜值和最小值,盤算跳轉頁面和以後頁絕對偏移,因為頁面鄰近,這個偏移量不會很年夜,如許的話m值絕對較小,年夜年夜削減掃描的行數。其實傳統的limit m,n,絕對的偏移一向是第一頁,如許的話越翻到前面,效力越差,而下面給出的辦法就沒有如許的成績。
留意SQL語句外面的ASC和DESC,假如是ASC掏出來的成果,顯示的時刻記得顛倒一下。
已在60W數據總量的表中測試,後果異常顯著。