欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

MySQL中怎么實(shí)現(xiàn)分頁查詢

這篇文章將為大家詳細(xì)講解有關(guān)MySQL中怎么實(shí)現(xiàn)分頁查詢,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了羅山免費(fèi)建站歡迎大家使用!

首先我們先創(chuàng)建一個(gè)訂單表,只攜帶一個(gè)主鍵,其他全部字段都不攜帶索引。然后使用存儲(chǔ)過程插入1000000條數(shù)據(jù)到數(shù)據(jù)表中:

MySQL中怎么實(shí)現(xiàn)分頁查詢

說到分頁呢?我們都知道使用limit關(guān)鍵字來進(jìn)行分頁,比如我們需要查詢id為900000到900100的數(shù)據(jù),我們可能會(huì)很熟練的這么進(jìn)行分頁:  

MySQL中怎么實(shí)現(xiàn)分頁查詢


可以看到我們直接使用limit查詢id處于900000到900100范圍的數(shù)據(jù)響應(yīng)時(shí)間為3.51秒,如果再加上業(yè)務(wù)處理邏輯的操作時(shí)間,基本上整個(gè)分頁查詢操作得耗時(shí)4秒以上,我們可以使用explain關(guān)鍵字查看剛才這個(gè)sql語句的運(yùn)行屬性:

MySQL中怎么實(shí)現(xiàn)分頁查詢

可以看到我們實(shí)際上查詢只需要100行數(shù)據(jù),但是數(shù)據(jù)庫會(huì)從第一行開始掃描,一直掃描到我們需要的數(shù)據(jù)才會(huì)停下來。在一個(gè)系統(tǒng)中每次查詢都掃描幾十萬行數(shù)據(jù),肯定性能大打折扣,因?yàn)榍懊?00000行數(shù)據(jù)對我們來說是無效數(shù)據(jù),所以我們首先可以先使用子查詢來優(yōu)化,先使用子查詢實(shí)現(xiàn)覆蓋索引查詢返回主鍵id,再使用主鍵id和原表做一個(gè)關(guān)聯(lián)操作,可以減少回表次數(shù)并且減少M(fèi)ysql掃描那些無效的行數(shù):

MySQL中怎么實(shí)現(xiàn)分頁查詢


我多次測試發(fā)現(xiàn)使用子查詢優(yōu)化后,想用的查詢結(jié)果只需要0.58秒左右。為什么使用子查詢能提供這么高的效率呢?因?yàn)槲覀償?shù)據(jù)表有20多個(gè)字段,我們子查詢使用select id效率在大數(shù)據(jù)的情況下大概是select *的3倍性能,而且id是主鍵可以利用索引優(yōu)化查詢速度,然后外層的查詢利用id也可以使用索引加快查詢效率,所以顯而易見使用子查詢進(jìn)行分頁效率比直接使用limit分頁效率高很多。  

那既然可以利用id主鍵的性質(zhì)來提升效率,其實(shí)我們可以進(jìn)一步去掉子查詢利用id區(qū)間范圍去查詢數(shù)據(jù):

MySQL中怎么實(shí)現(xiàn)分頁查詢


可以看到利用between...and將id局限在指定范圍查詢分頁只需要0.06秒,為什么會(huì)這么快呢,我們可以利用explain測試一下運(yùn)行屬性:

MySQL中怎么實(shí)現(xiàn)分頁查詢

可以看到只掃描了100行數(shù)據(jù),所以效率自然而然提高了。但是id限制查詢都存在一個(gè)條件:就是你數(shù)據(jù)庫數(shù)據(jù)必須按照id連續(xù)并且不能中斷,這是為什么呢?其實(shí)很好理解,數(shù)據(jù)庫比如有100條數(shù)據(jù)分別id為1---100,如果我要查詢第50--60條的數(shù)據(jù),我可以使用下列sql語句:  
select * from aok_score_info where id between 50 and 60 limit 10;
 

但是如果中間有一部分無效數(shù)據(jù),我需要?jiǎng)h除,我將id為30--40的數(shù)據(jù)刪除,這時(shí)候我要查詢第50--60條的數(shù)據(jù),如果還使用上面的sql語句,查出來的一樣是id為50--60的數(shù)據(jù),但是實(shí)際上數(shù)據(jù)庫第50--60條的數(shù)據(jù)應(yīng)該id為60--70.所以說id限制分頁查詢效率很高但是有局限性,局限性就在于不能刪除數(shù)據(jù)以保證id的連續(xù)性,而子查詢不能使用where子句,因?yàn)槭褂脀here子句會(huì)篩選條件會(huì)導(dǎo)致id失去連續(xù)性。所以在id能保證連續(xù)性的情況下我們可以選擇使用限制id的方法提高分頁效率。接下來我們看下如果id無法保證絕對連續(xù)除了子查詢還能如何處理。

首先我們還是以剛才這100萬條數(shù)據(jù)來測試,id目前是連續(xù)的從1--100000,我們現(xiàn)在使用inner join在子查詢中只查詢索引列id,然后通過id去讀取需要的列:

MySQL中怎么實(shí)現(xiàn)分頁查詢

可以看到只需要0.735秒,但是很明顯我們現(xiàn)在id是連續(xù)的。我們現(xiàn)在刪除id為10001--13000的3000條數(shù)據(jù),然后再測試:

MySQL中怎么實(shí)現(xiàn)分頁查詢

很明顯我們可以看到查詢出的記錄順延了3000條,也就可以表示我們在id不連續(xù)的時(shí)候可以使用只讀索引方法來優(yōu)化limit語句,可以大幅度提高分頁的效率。而我開發(fā)中經(jīng)常使用一種方法:客戶端傳id和size表示當(dāng)前頁數(shù)id最大值以及每頁條數(shù),然后直接使用id查詢順推的size條數(shù)據(jù),舉個(gè)例子比如我們第八頁返回id為701--800的數(shù)據(jù),然后查詢第九頁時(shí)只需要將第七頁最大id800傳過來,就可以順推得到接下來100條數(shù)據(jù):

MySQL中怎么實(shí)現(xiàn)分頁查詢

比如客戶端查詢第一頁,id傳0,則后端可以使用下列sql語句:

select * from aok_score_info limit 0, 10;

由于查詢時(shí)第一頁的數(shù)據(jù),所以掃描速度很快,之后頁數(shù)查詢傳當(dāng)前頁數(shù)id最大值,比如傳參id為9999,表示上一頁的最大id為9999,那么我們就從9999開始順推查詢,可以看到中間刪掉的3000條記錄都會(huì)直接跳過,所以不會(huì)影響我們查詢的正確性,最關(guān)鍵的是id是主鍵上面有索引,這個(gè)sql語句執(zhí)行時(shí)間0.04秒,可以說在高并發(fā)的情況下也基本可以滿足要求了。這是我個(gè)人開發(fā)中所理解的幾種分頁的方案,有不同見解的可以提出來一起討論討論。

關(guān)于MySQL中怎么實(shí)現(xiàn)分頁查詢就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前標(biāo)題:MySQL中怎么實(shí)現(xiàn)分頁查詢
文章URL:http://www.chinadenli.net/article30/jdgjpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)做網(wǎng)站品牌網(wǎng)站制作商城網(wǎng)站品牌網(wǎng)站建設(shè)

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)