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

执行结果:

python-Django框架,分页以及数据库执行情况详细探究_第1张图片

在执行all的时候:

永远会带21

最厉害的是django里面判断你要真的取出数据来操作时候会真的全表查,如果只是取出queryset赋值,在数据最后返回页面才会

执行分片,或者limit 21。

你可能感兴趣的:(python-django)