使用标准的数据库优化技术:数据库
在进行Django数据库访问性能优化以前,首先应该使用标准的数据库技术对其进行优化,好比给字段加索引,经过使用 django.db.models.Field.db_index
来给一个Django模型类的字段加索引,设置这个属性字段的Field.db_index=True
。django
注:django对model中的fk
和unique = True
的字段将自动建立索引。缓存
理解Django中QuerySet的工做机制对数据库访问优化相当重要:性能优化
QuerySet是懒加载的,它只有在须要的时候才会被执行,而且会将执行的结果保存在内存中。函数
理解Django中QuerySet的缓存机制:性能
QuerySet对调用方法是不执行缓存的。好比下面的两端代码,其中一个会被缓存,另外一个不会:优化
>>> entry = Entry.objects.get(id=1) >>> entry.blog # Blog对象会被从数据库查询出来 >>> entry.blog # 第二次访问的缓存对象,不会再次执行查询
可是对于调用的查询方法,是不会被缓存的:code
>>> entry = Entry.objects.get(id=1) >>> entry.authors.all() # 第一次会执行查询 >>> entry.authors.all() # 第二次会再执行一次查询
使用模板语言中的with标签:对象
在视图模板中,针对QuerySet对象使用with
标签,可让数据被缓存起来使用。blog
使用iterator()
方法:
对于缓存的QuerySet使用iterator()
方法。
将查询计算操做放在数据库中完成,不要在Python代码中完成。
使用filter
,exclude
完成查询过滤;
F()
查询表达式;
使用聚合函数来完成数据库聚合操做。
使用QuerySet.extra()
明确的指出要查询的字段。
对于复杂的数据库查询操做,使用原生SQL实现。
尽可能一次查询出全部须要的信息。
只查询须要的数据:
某些状况下,只使用 QuerySet.values()
和 values_list()
方法,查询出符合条件的结果集而不是完整的对象结果集;
某些状况下,只使用 QuerySet.defer()
和 only()
过滤数据。
若是只是查询集合的数量,使用QuerySet.count()
函数,而不是len(QuerySet)
;
若是想知道某个记录是否包含在某个结果集中,使用 QuerySet.exists()
函数;
避免过多的使用 count()
和 exists()
函数;
对于批量更新和删除操做使用 QuerySet.update()
和 QuerySet.delete()
;
理解 QuerySet.select_related()
方法:
select_related()
会在查询过程当中尽可能深刻的查询关联数据,这样在须要查询大量外键的数据时很是有用,如:
>>> e=Entry.objects.get(id=5) #这部操做会查询数据库 >>> b=e.blog #该操做会再次查询数据库
而采用select_related()
查询的效果是:
>>> e=Entry.objects.select_related().get(id=5) #这步操做会查询数据库 >>> b=e.blog #不会再次查询数据库
若是须要查询对象的外键,则使用外键字段而不是使用关联的对象的主键,好比:
>>> entry.blog_id #应该使用这种方式 >>> entry.blog.id #不要使用这种方式