1. 程式人生 > >python-Django框架,分頁以及資料庫執行情況詳細探究

python-Django框架,分頁以及資料庫執行情況詳細探究

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。