Django之DB数据库优化

Django之DB数据库优化

取所有书的书名

res = models.Book.objects.values("title") #拿到的是一个列表套字典

还要for循环再res.get("title")

res=models.Book.objects.only("title")

拿到的是Book对象列表,此Book对象只封装了书名title属性

Django之DB数据库优化

此时你可以i.price尽管Book对象里面没有封装price,但是仍然可以查到,但是会重新去DB里面查询

only括号里面没有的字段,会重新查询

res=models.Book.objects.all()

查到的对象,已经有了对象所有的属性,想查什么就查什么,不会再走数据库。

 

defer()

res=models.Book.objects.defer("title")

拿到的仍是数据对象,他与oble()刚好相反,defer括号内放的字段不在查询出来的对象里面

想查询title字段,必须重走数据库,而如果查询的是非括号内字段,不再走数据库,可以直接.来获得。

select_related和prefetch_related 与跨表有关

Django之DB数据库优化

  这里从book表,跨表查看出版社名字。会导致查出来的Book对象,每个都去跨表查一次出版社名

 

Django之DB数据库优化

res=models.Book.obejcts.select_related("publish")

print(res)

Django之DB数据库优化

这样网络请求少了,数据IO少了,相当于进行了优化,但是表如果很大,那么拼表的耗时会很长。

select_related里面只能放外键字段。只能放一对一和一对多

不能放多对多

pretch_related

多表操作除了连表操作,还可以用子查询,一张表的查询结果,当做领一张表的查询条件,比连表查询多了一次查询

Django之DB数据库优化

子查询虽然查询次数多,但是单表先查询可能1秒,加起来2秒,不一定就慢于连表的时间,一定要看实际情况。

使用者感觉不出来两个方法的区别,只是内部的原理不同。

 

Django之DB数据库优化

上一篇:Mysql排序后分页,因数据重复导致分页数据紊乱的问题


下一篇:【MySQL】查询不在表中的数据