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:方法内部其实就是子查询
两者查询优势具体要看情况,如果表数据很多时,联表可能需要花费的时间比子查询花费的时间更多