Django中数据库的查询优化

1.only 与 defer

先在models.py中创建4张表,建立表关系,其中图书表跟出版社表是一对多关系,图书表跟作者表是多对多关系,作者表跟作者详情表是一对一关系。

 

 在表中录入对应的数据,如下:

 

 

 

1.1 only方法测试如下图:

通过上面的测试说明:通过only字段查询数据库,再次调用only括号内指定的字段,不需要再调用数据库就能拿到对应的数据,而调用不在only括号内的字段,则需要再次通过调用数据库才能拿到对应的数据。

1.2 defer方法测试:

 通过上面的测试说明:defer方法中,defer查询defer括号中对应的字段,需要再次调用数据库才能得到对应的数据,而查询defer括号内以外的字段,则不需要再次调用数据库就能获取对应的数据

 

总结:

  only与defer的区别:

    only查括号内放的字段 不需要再调用数据库 而查不在括号内的字段,则需要重新调用数据库
    defer查括号内的字段需要重新调用数据库 而查不在括号内的字段,不需要重新调用数据库
    所以这两者刚好相反。

 


 

2.select_related 与 prefetch_related

2.1 select_related方法测试:

从上面的测试中可以看出,select_related方法的内部其实就是联表查询,而且每循环一次就需要调用一次数据库

2.2 prefetch_related方法测试:

 从上面的测试中,可以看出prefetch_related方法的内部其实就是子查询,而且整个循环只需要调用一次数据库即可

 

总结:

  select_related 和 prefetch_related 的区别:
        select_related:方法内部其实就是联表查询
        prefetch_related:方法内部其实就是子查询
        两者查询优势具体要看情况,如果表数据很多时,联表可能需要花费的时间比子查询花费的时间更多

posted @ 2022-03-15 20:55  _yessir  阅读(165)  评论(0编辑  收藏  举报