怎么讓mysql向下翻頁(yè) mysql跨頁(yè)問(wèn)題

在mysql中翻頁(yè)是不是有比LIMIT OFFSET更好的選擇

以前在數(shù)據(jù)中寫(xiě)翻頁(yè)的代碼時(shí),一直把sql寫(xiě)成這樣

十載的永福網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整永福建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“永福網(wǎng)站設(shè)計(jì)”,“永福網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

SELECT * FROM table_name ORDER BY id ASC LIMIT 10 OFFSET 10

也就是用LIMIT和OFFSET來(lái)控制需要輸出的內(nèi)容區(qū)域,后來(lái)我在翻其他人代碼時(shí)看到了這種寫(xiě)法

SELECT * FROM table_name WHERE id 10 ORDER BY id ASC LIMIT 10

這種寫(xiě)法是否比前一種寫(xiě)法的速度要更快,因我看到它使用id主鍵的索引,而且還把檢索區(qū)域用id 10縮小了,理論上應(yīng)該更快。但這種寫(xiě)法應(yīng)該也有一定的局限性,比如最大的局限就是它只能用于那種類似timeline的,從第一頁(yè)往后翻的應(yīng)用場(chǎng)景,因?yàn)槟阋乱豁?yè)必須知道前一頁(yè)的最后偏移是多少。

不知道我這樣的分析是否正確,各位有什么樣的看法。

MySql中查詢語(yǔ)句實(shí)現(xiàn)分頁(yè)功能

pageNow代表當(dāng)前頁(yè)面,第一頁(yè)。

第一部分:看一下分頁(yè)的基本原理:

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

第二部分:根據(jù)雅虎的幾位工程師帶來(lái)了一篇Efficient Pagination Using MySQL的報(bào)告內(nèi)容擴(kuò)展:在文中提到一種clue的做法,給翻頁(yè)提供一些線索,比如還是SELECT * FROM message ORDER BY id DESC,按id降序分頁(yè),每頁(yè)20條,當(dāng)前是第10頁(yè),當(dāng)前頁(yè)條目id最大的是1020,最小的是1000,如果我們只提供上一頁(yè)、下一頁(yè)這樣的跳轉(zhuǎn)(不提供到第N頁(yè)的跳轉(zhuǎn)),那么在處理上一頁(yè)的時(shí)候SQL語(yǔ)句可以是:

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

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

缺點(diǎn)是只能提供上一頁(yè)、下一頁(yè)的鏈接形式,但是我們的產(chǎn)品經(jīng)理非常喜歡“上一頁(yè) 1 2 3 4 5 6 7 8 9 下一頁(yè)”這樣的鏈接方式,怎么辦呢?

如果LIMIT m,n不可避免的話,要優(yōu)化效率,只有盡可能的讓m小一下,我們擴(kuò)展前面的clue做法,還是SELECT * FROM message ORDER BY id DESC,按id降序分頁(yè),每頁(yè)20條,當(dāng)前是第10頁(yè),當(dāng)前頁(yè)條目id最大的是2519,最小的是2500;

當(dāng)是第10頁(yè)的SQL如下:

比如要跳到第9頁(yè),SQL語(yǔ)句可以這樣寫(xiě):

比如要跳到第8頁(yè),SQL語(yǔ)句可以這樣寫(xiě):

原理還是一樣,記錄住當(dāng)前頁(yè)id的最大值和最小值,計(jì)算跳轉(zhuǎn)頁(yè)面和當(dāng)前頁(yè)相對(duì)偏移,由于頁(yè)面相近,這個(gè)偏移量不會(huì)很大,這樣的話m值相對(duì)較小,大大減少掃描的行數(shù)。其實(shí)傳統(tǒng)的limit m,n,相對(duì)的偏移一直是第一頁(yè),這樣的話越翻到后面,效率越差,而上面給出的方法就沒(méi)有這樣的問(wèn)題。

mysql如何實(shí)現(xiàn)高效分頁(yè)

先看一下分頁(yè)的基本原理(我拿的是CSDN那個(gè)百萬(wàn)級(jí)數(shù)據(jù)庫(kù)來(lái)測(cè)試?。篠ELECT * FROM `csdn` ORDER BY id DESC LIMIT 100000,2000;

耗時(shí): 0.813ms分析:對(duì)上面的mysql語(yǔ)句說(shuō)明:limit 100000,2000的意思掃描滿足條件的102000行,扔掉前面的100000行,返回最后的2000行。問(wèn)題就在這里,如果是limit 100000,20000,需要掃描120000行,在一個(gè)高并發(fā)的應(yīng)用里,每次查詢需要掃描超過(guò)100000行,性能肯定大打折扣。在《efficient pagination using mysql》中提出的clue方式。利用clue方法,給翻頁(yè)提供一些線索,比如還是SELECT * FROM `csdn` order by id desc,按id降序分頁(yè),每頁(yè)2000條,當(dāng)前是第50頁(yè),當(dāng)前頁(yè)條目id最大的是102000,最小的是100000。如果我們只提供上一頁(yè)、下一頁(yè)這樣的跳轉(zhuǎn)(不提供到第N頁(yè)的跳轉(zhuǎn))。那么在處理上一頁(yè)的時(shí)候SQL語(yǔ)句可以是:

SELECT * FROM `csdn` WHERE id=102000 ORDER BY id DESC LIMIT 2000; #上一頁(yè)

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

耗時(shí):0.015ms這樣,不管翻多少頁(yè),每次查詢只掃描20行。效率大大提高了!但是,這樣分頁(yè)的缺點(diǎn)是只能提供上一頁(yè)、下一頁(yè)的鏈接形式。

本文題目:怎么讓mysql向下翻頁(yè) mysql跨頁(yè)問(wèn)題
轉(zhuǎn)載來(lái)于:http://muchs.cn/article0/ddigoio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、外貿(mào)建站微信小程序、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司