A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一,对于中大型网站,最影响网站性能的就是数据库查询部分,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) 来减少数据库的访问,减少查询结果占用的内存空间从而提升网站的性能。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马