中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中怎么實現分頁查詢

發布時間:2021-07-13 15:00:01 來源:億速云 閱讀:234 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關MySQL中怎么實現分頁查詢,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

首先我們先創建一個訂單表,只攜帶一個主鍵,其他全部字段都不攜帶索引。然后使用存儲過程插入1000000條數據到數據表中:

MySQL中怎么實現分頁查詢

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

MySQL中怎么實現分頁查詢


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

MySQL中怎么實現分頁查詢

可以看到我們實際上查詢只需要100行數據,但是數據庫會從第一行開始掃描,一直掃描到我們需要的數據才會停下來。在一個系統中每次查詢都掃描幾十萬行數據,肯定性能大打折扣,因為前面900000行數據對我們來說是無效數據,所以我們首先可以先使用子查詢來優化,先使用子查詢實現覆蓋索引查詢返回主鍵id,再使用主鍵id和原表做一個關聯操作,可以減少回表次數并且減少Mysql掃描那些無效的行數:

MySQL中怎么實現分頁查詢


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

那既然可以利用id主鍵的性質來提升效率,其實我們可以進一步去掉子查詢利用id區間范圍去查詢數據:

MySQL中怎么實現分頁查詢


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

MySQL中怎么實現分頁查詢

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

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

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

MySQL中怎么實現分頁查詢

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

MySQL中怎么實現分頁查詢

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

MySQL中怎么實現分頁查詢

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

select * from aok_score_info limit 0, 10;

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

關于MySQL中怎么實現分頁查詢就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

古浪县| 阿巴嘎旗| 南岸区| 宁化县| 娄烦县| 抚顺县| 共和县| 沂源县| 平利县| 建昌县| 南川市| 天津市| 镇原县| 张家港市| 台东市| 凤冈县| 隆子县| 九江市| 郁南县| 长顺县| 西青区| 敦煌市| 称多县| 来凤县| 志丹县| 延长县| 莱芜市| 大荔县| 镇坪县| 彭泽县| 兴隆县| 绵阳市| 利津县| 贵州省| 晋中市| 阳朔县| 青河县| 兴山县| 贺兰县| 喀喇沁旗| 镇安县|