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。