首頁技術(shù)文章正文

Paginator進(jìn)行大數(shù)據(jù)集分頁:如何提升性能?

更新時(shí)間:2020-08-03 來源:黑馬程序員 瀏覽量:

學(xué)過Django框架的同學(xué),一定都使用過Django框架的Paginator分頁功能,今天我們要討論的是關(guān)于使用Paginator進(jìn)行大數(shù)據(jù)集分頁時(shí),它性能的優(yōu)化問題。

Paginator分頁

下面步入正題,首先我們來看一個(gè)Django中使用Paginator進(jìn)行分頁的例子:

1)首先我創(chuàng)建了一個(gè)Django項(xiàng)目并定義了一個(gè)User用戶模型類

Django海量數(shù)據(jù)分頁優(yōu)化01


2)執(zhí)行遷移在數(shù)據(jù)庫中生成tb_users用戶表并添加800萬個(gè)測試用戶數(shù)據(jù)

Django海量數(shù)據(jù)集分頁優(yōu)化02

3)編寫使用Paginator類進(jìn)行分頁的測試代碼,并測試獲取相應(yīng)頁的數(shù)據(jù)

Django海量數(shù)據(jù)集分頁優(yōu)化03

4)分頁測試代碼執(zhí)行完成之后,我們來看終端輸出的內(nèi)容

Django海量數(shù)據(jù)集分頁優(yōu)化04

5)對于上面的分頁測試結(jié)果,我們再來看一下mysql的日志記錄數(shù)據(jù)

Django海量數(shù)據(jù)集分頁優(yōu)化05

注:mysql的日志文件在/var/log/mysql/mysql.log,測試之前可以先使用tail -f /var/log/mysql/mysql.log打開這個(gè)文件,測試之后就可以看到對應(yīng)輸出的日志信息

6)看完上面的內(nèi)容之后,接下來我們就可以看Django框架關(guān)于Paginator類分頁的官網(wǎng)文檔了

Django海量數(shù)據(jù)集分頁優(yōu)化06

上面紅色框框里的提示就是告訴我們,在使用Paginator對大數(shù)據(jù)量的QuerySet進(jìn)行分頁時(shí),如果請求頁碼較大的某頁數(shù)據(jù)時(shí),查詢效率可能會(huì)很慢,因?yàn)長imit/Offset分頁時(shí),先要根據(jù)Offset偏移量從前向后掃描數(shù)據(jù)。

PS:看到這里,是不是感覺到了官網(wǎng)文檔的重要性,很多問題在官網(wǎng)文檔上都有對應(yīng)的說明,下面附上這個(gè)文檔的鏈接:https://docs.djangoproject.com/zh-hans/2.2/topics/pagination/

分頁問題解決

好,說了這么多,最后的問題要來了,怎么解決這個(gè)問題呢?下面咱們來說一個(gè)很多大廠使用的解決方案,什么方案呢,會(huì)不會(huì)很高大上呢?

其實(shí)很簡單,就是限制用戶請求的最大頁數(shù),比如只允許用戶訪問前100頁的數(shù)據(jù),如果請求的頁碼超過100頁,可以默認(rèn)返回第1頁的數(shù)據(jù),這樣就不會(huì)有上面的問題,是不是很簡單呢。這個(gè)思想也很簡單,大家平時(shí)搜索內(nèi)容或購買商品時(shí),是不是只會(huì)瀏覽前幾頁的內(nèi)容呢?不用我回答,你應(yīng)該已經(jīng)有了答案

小知識(shí):百度搜索內(nèi)容顯示時(shí),只允許用戶訪問前76頁的內(nèi)容;淘寶搜索上面商品顯示時(shí),只允許用戶訪問前100頁的內(nèi)容。

最后,怎么知道這個(gè)解決方案的?其實(shí)還是在文檔,大家請看。

Django海量數(shù)據(jù)集分頁優(yōu)化07


附上文檔鏈接:https://code.djangoproject.com/ticket/14131,建議大家平時(shí)自己多看文檔,授人以魚不如授人以漁,假以時(shí)日,這就是你的漁。

好啦,關(guān)于大數(shù)據(jù)集分頁的問題,咱們今天就說到這,有沒有其它方案呢?大家可以多去探索。


猜你喜歡:

“?!笔鞘裁?如何實(shí)現(xiàn)一個(gè)“棧”?

Python編程加入日志的方法

黑馬程序員Python培訓(xùn)課程

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!