Django查询优化

作者: 乔治大叔 | 来源:发表于2019-02-10 14:56 被阅读120次

1. select_related

Django中的查询是惰性的。这意味着在你真正需要获取数据之前它不会访问数据库。同时,它只获取你指定的数据,如果需要其他附加数据,则要另外发出请求。为了提取所有需要的数据,可以在查询集上使用select_related()

对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。

select_related 返回一个QuerySet,当执行它的查询时它沿着外键关系查询关联的对象的数据。它会生成一个复杂的查询并引起性能的损耗,但是在以后使用外键关系时将不需要数据库查询。

简单说,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。

2. prefetch_related()

对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。

prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,在SQL查询内解决问题。但是对于多对多关系,使用SQL语句解决就显得有些不太明智,因为JOIN得到的表将会很长,会导致SQL语句运行时间的增加和内存占用的增加。若有n个对象,每个对象的多对多字段对应Mi条,就会生成Σ(n)Mi 行的结果表。

prefetch_related()的解决方法是,分别查询每个表,然后用Python处理他们之间的关系。

相关文章

  • Django查询优化

    1. select_related Django中的查询是惰性的。这意味着在你真正需要获取数据之前它不会访问数据库...

  • Django查询优化

    1. select_related Django中的查询是惰性的。这意味着在你真正需要获取数据之前它不会访问数据库...

  • Django orm多表查询优化

    1.基本操作 2.Foreign key的使用原因 下面两个 取到的是对象,并且注意 取到的对象可以 获取其他字段...

  • Django中多条件查询优化

    传统模式 当查询条件为两个时,假设我们这里查询条件为tag、name 可想而知,当条件很多时,写这么复杂的工作,足...

  • MySQL性能调优

    MYSQL查询语句优化 mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬...

  • mysql优化

    MYSQL优化 为查询缓存优化你的查询 EXPLAIN你的SELECT查询。根据结果给出分析相应的查询优化 当只要...

  • 《高性能Mysql》-查询优化

    优化性能需要查询优化、索引优化、库表结构优化这三辆马车齐头并进。这篇文章主要围绕查询优化,要对查询进行优化首先需要...

  • Django模型基础数据的增删改查(二十)

    一、django调试工具---django shell 进入django shell工具的具体命令如下: 二、查询...

  • Day2:MySQL慢查询基础-查询慢原因

    说在前面: 查询优化、索引优化、库表结构优化是查询性能优化的三驾马车。 完成一个完整的查询生命周期,查询需要在...

  • aggregate和annotate方法的使用场景

    Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需...

网友评论

    本文标题:Django查询优化

    本文链接:https://www.haomeiwen.com/subject/gkxxeqtx.html