全國(guó)咨詢(xún)/投訴熱線:400-618-4000

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

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

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

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

Paginator分頁(yè)

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

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

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


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

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

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

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

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

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

5)對(duì)于上面的分頁(yè)測(cè)試結(jié)果,我們?cè)賮?lái)看一下mysql的日志記錄數(shù)據(jù)

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

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

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

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

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

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

分頁(yè)問(wèn)題解決

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

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

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

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

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


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

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


猜你喜歡:

“棧”是什么?如何實(shí)現(xiàn)一個(gè)“?!?

Python編程加入日志的方法

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

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!