python-Django框架,分頁以及資料庫執行情況詳細探究
阿新 • • 發佈:2019-01-25
1、django框架在list頁面時候查詢效率問題
django的list寫法一般是先
list=xxx.objects.all()或者xxx.objects.filter(Q)
再將list,放進django自帶分頁物件
Paginator(list, limit),進行分頁操作
剛開始以為先all,會將資料表所有記錄全部select出來,再放進Paginator進行分頁,效率會非常低。
查了網上,網上也有很多教程教你自己用python切片寫高效分頁。
其實全部對django一知半解搞錯了。
正確的是:
django的queryset是懶查詢,最後返回頁面的時候才會真正的去執行sql查詢,在一定要objects.all()的時候。django
預設會帶上select...limit 21。除非程式碼裡寫死了取出all,再把all拿來複制,遍歷操作,這樣會執行全表查詢。
其他時候select永遠會加上limit分片或limit 21。所以完全不用擔心和考慮django的列表頁面的效率。django很成熟了,不會範這種錯誤。
為了驗證這個問題,我開啟了mysql的sql日誌實時輸出。
詳細方法,可參照其他大神的辦法:http://blog.csdn.net/u014180504/article/details/73826679
執行結果:
在執行all的時候:
永遠會帶21
最厲害的是django裡面判斷你要真的取出資料來操作時候會真的全表查,如果只是取出queryset賦值,在資料最後返回頁面才會
執行分片,或者limit 21。