更新時(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用戶模型類
2)執(zhí)行遷移在數(shù)據(jù)庫中生成tb_users用戶表并添加800萬個(gè)測試用戶數(shù)據(jù)
3)編寫使用Paginator類進(jìn)行分頁的測試代碼,并測試獲取相應(yīng)頁的數(shù)據(jù)
4)分頁測試代碼執(zhí)行完成之后,我們來看終端輸出的內(nèi)容
5)對(duì)于上面的分頁測試結(jié)果,我們再來看一下mysql的日志記錄數(shù)據(jù)
注:mysql的日志文件在/var/log/mysql/mysql.log,測試之前可以先使用tail -f /var/log/mysql/mysql.log打開這個(gè)文件,測試之后就可以看到對(duì)應(yīng)輸出的日志信息
6)看完上面的內(nèi)容之后,接下來我們就可以看Django框架關(guān)于Paginator類分頁的官網(wǎng)文檔了
上面紅色框框里的提示就是告訴我們,在使用Paginator對(duì)大數(shù)據(jù)量的QuerySet進(jìn)行分頁時(shí),如果請求頁碼較大的某頁數(shù)據(jù)時(shí),查詢效率可能會(huì)很慢,因?yàn)長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í)很簡單,就是限制用戶請求的最大頁數(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í)還是在文檔,大家請看。
附上文檔鏈接:https://code.djangoproject.com/ticket/14131,建議大家平時(shí)自己多看文檔,授人以魚不如授人以漁,假以時(shí)日,這就是你的漁
好啦,關(guān)于大數(shù)據(jù)集分頁的問題,咱們今天就說到這,有沒有其它方案呢?大家可以多去探索。
猜你喜歡:
北京校區(qū)