教育行業(yè)A股IPO第一股(股票代碼 003032)

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

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

更新時(shí)間:2020年08月03日14時(shí)55分 來源:傳智播客 瀏覽次數(shù):

學(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è)測(cè)試用戶數(shù)據(jù)

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

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

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

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

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

5)對(duì)于上面的分頁測(cè)試結(jié)果,我們?cè)賮砜匆幌耺ysql的日志記錄數(shù)據(jù)

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

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

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

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


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

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

分頁問題解決

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

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

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

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

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)課程

0 分享到:
和我們?cè)诰€交談!