溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL分頁(yè)基本原理有哪些

發(fā)布時(shí)間:2021-09-16 15:47:27 來(lái)源:億速云 閱讀:254 作者:chen 欄目:數(shù)據(jù)庫(kù)

這篇文章主要介紹“MySQL分頁(yè)基本原理有哪些”,在日常操作中,相信很多人在MySQL分頁(yè)基本原理有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL分頁(yè)基本原理有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

  mysql>explainSELECT*FROMmessageORDERBYidDESCLIMIT10000,20\G*****************1.row**************id:1select_type:SIMPLEtable:messagetype:indexpossible_keys:NULLkey:PRIMARYkey_len:4ref:NULLrows:10020Extra:1rowinset(0.00sec)

  limit10000,20的意思掃描滿足條件的10020行,扔掉前面的10000行,返回最后的20行,問(wèn)題就在這里,如果是limit100000,100,需要掃描100100行,在一個(gè)高并發(fā)的應(yīng)用里,每次查詢需要掃描超過(guò)10W行,性能肯定大打折扣。文中還提到limitn性能是沒(méi)問(wèn)題的,因?yàn)橹粧呙鑞行。

  如何構(gòu)建高效的MySQL分頁(yè)

  文中提到一種”clue”的做法,給翻頁(yè)提供一些”線索”,比如還是SELECT*FROMmessageORDERBYidDESC,按id降序分頁(yè),每頁(yè)20條,當(dāng)前是第10頁(yè),當(dāng)前頁(yè)條目id最大的是9527,最小的是9500,如果我們只提供”上一頁(yè)”、”下一頁(yè)”這樣的跳轉(zhuǎn)(不提供到第N頁(yè)的跳轉(zhuǎn)),那么在處理”上一頁(yè)”的時(shí)候SQL語(yǔ)句可以是:

  SELECT*FROMmessageWHEREid>9527ORDERBYidASCLIMIT20;

  處理”下一頁(yè)”的時(shí)候SQL語(yǔ)句可以是:

  SELECT*FROMmessageWHEREid<9500ORDERBYidDESCLIMIT20;   不管翻多少頁(yè),每次查詢只掃描20行。   缺點(diǎn)是只能提供”上一頁(yè)”、”下一頁(yè)”的鏈接形式,但是我們的產(chǎn)品經(jīng)理非常喜歡”<上一頁(yè)123456789下一頁(yè)>”這樣的鏈接方式,怎么辦呢?

  如果LIMITm,n不可避免的話,要優(yōu)化效率,只有盡可能的讓m小一下,我們擴(kuò)展前面的”clue”做法,還是SELECT*FROMmessageORDERBYidDESC,按id降序分頁(yè),每頁(yè)20條,當(dāng)前是第10頁(yè),當(dāng)前頁(yè)條目id最大的是9527,最小的是9500,比如要跳到第8頁(yè),我看的SQL語(yǔ)句可以這樣寫:

  SELECT*FROMmessageWHEREid>9527ORDERBYidASCLIMIT20,20;

  跳轉(zhuǎn)到第13頁(yè):

  SELECT*FROMmessageWHEREid<9500ORDERBYidDESCLIMIT40,20;   原理還是一樣,記錄住當(dāng)前頁(yè)id的最大值和最小值,計(jì)算跳轉(zhuǎn)頁(yè)面和當(dāng)前頁(yè)相對(duì)偏移,由于頁(yè)面相近,這個(gè)偏移量不會(huì)很大,這樣的話m值相對(duì)較小,大大減少掃描的行數(shù)。其實(shí)傳統(tǒng)的limitm,n,相對(duì)的偏移一直是第一頁(yè),這樣的話越翻到后面,效率越差,而上面給出的方法就沒(méi)有這樣的問(wèn)題。   注意SQL語(yǔ)句里面的ASC和DESC,如果是ASC取出來(lái)的結(jié)果,顯示的時(shí)候記得倒置一下。   已在60W數(shù)據(jù)總量的表中測(cè)試,效果非常明顯。  

到此,關(guān)于“MySQL分頁(yè)基本原理有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI