如何利用Django中queryset的特性提高查询效率

一,对于中大型网站,最影响网站性能的就是数据库查询部分,why?
  • 反复从数据库读写数据会很消费时间和计算资源
  • 返回的数据集queryset过大时会占很大的内存
     
 
二,什么是QuerySet?
  • QuerySet是django提供的数据库API接口
  • 好处:可以使用filter/exclude/get/create等方法进行数据库操作,不需使用sql语句进行数据库交互
  • 数据库查询的结果是一个集合的话,称为查询集queryset
     


三,Django的QuerySet是惰性的

当定义我们使用filter/exculde等进行查询时,Django的数据库API接口QuerySet并没有对数据库进行查询操作。只有进一步运算时才会对数据库进行查询操作,queryset的执行,Django这样设计的是为了尽量减少对数据库的无效操作,比如查询了结果而不用造成计算资源的浪费。
 

四,Django的QuerySet自带缓存(Cache)

当遍历queryset(city_list)时,匹配的记录会从数据库获取。结果会载入内存并保存在queryset内置的cache中。如果再次遍历或读取这个article_list时,就不需要重复查询,这样也可减少对数据库的查询。
 

五,用exitst()判断数据集是否存在有时只想要了解查询的结果是否存在,而不需使用整个数据集,exists只会检查查询结果是否存在,返回True或False,而不会缓存

 

六,统计查询结果数量优选count方法

len()与count():均能统计查询结果的数量
count:更快,它是从数据库层面直接获取查询结果的数量,而不是返回整个查询集
len:会导致queryset的执行,需将整个queryset载入内存后才能统计其长度。但如果数据集queryset已经在缓存里了,使用len更快,因为它不需要跟数据库再次打交道。


七,当queryset非常大时,数据按需取

queryset比较大,占用大量内存(缓存).
使用values和value_list方法按需提取数据
values和values_list是以字典形式返回数据,而不是对象集合
例如:只需城市名称,就不需将城市的全部信息提取出来


八,更新数据库部分字段请用update方法

如果需要对数据库中的某条已有数据或某些字段进行更新,更好的方式是用update,而不是save方法。
即使单条信息占用内存不多,但是数据量比较大时,占用的内存加起来很多。
update方法会返回已更新条目的数量,save方法对于单个模型的更新还是很有优势的,比如save(commit=False), article.author = request.user等等事情update都做不来
 

九,专业地使用explain方法

Django 2.1中QuerySet新增了explain方法,统计一个查询所消耗的执行时间。这可以更好地优化查询结果。


十,总结:

Django QuerySet的惰性和缓存特性对于减少数据库的访问次数非常有用。你需要根据不同应用场景选择合适的方法(比如exists, count, update, values) 来减少数据库的访问,减少查询结果占用的内存空间从而提升网站的性能。
发布了458 篇原创文章 · 获赞 2 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u010395024/article/details/103851128