黑马程序员技术交流社区
标题: 【广州python】如何利用Django中queryset的特性提高查询效率 [打印本页]
作者: 丁柳 时间: 2019-1-17 16:41
标题: 【广州python】如何利用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) 来减少数据库的访问,减少查询结果占用的内存空间从而提升网站的性能。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |