浅谈优化浅谈优化Django ORM中的性能问题中的性能问题
Django是个好工具,使用的很广泛。 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效
了。当你了解所用的Web框架一些内部机制之后,才能写成比较高效的代码。
怎么查问题怎么查问题
Web系统是个挺复杂的玩意,有时候有点无从下手哈。可以采用 自底向上 的顺序,从数据存储一直到数据展现,按照这个顺
序一点一点查找性能问题。
数据库 (缺少索引/数据模型)
数据存储接口 (ORM/低效的查询)
展现/数据使用 (Views/报表等)
Web应用的大部分问题都会跟 数据库 扯上关系。除非你正在处理大量的数据并知道你在做什么,否则不要去考虑用Big-O表
示法思考View的问题。 数据库调用的开销将使循环和模板渲染的开销相形见绌。 不首先解决数据库使用中的问题,您就不能
继续解决其他问题。
Django的文档中有那么一节,详细的描述了DB部分优化, ORM 从一开始就应该写的比较高效一些(毕竟有那么多最佳实践)
优化,很多时候意味着代码可能变得不太清晰。当你遇到选择清晰的代码,还是牺牲清晰代码来获取性能上的一点点提高的时
候,请优先考虑要代码的清晰整洁
工具工具
解决问题的第一步是找到问题,面对 ORM,有时间事情可以做。
理解 django.db.connection, 这个对象可以用来记录当前查询花费的时间(知道了SQL语句查询的时间,当然就知道那里慢了)
>>> from django.db import connection
>>> connection.queries
[] >>> Author.objects.all()
<QuerySet [<Author: Author object>]>
>>> connection.queries
[{u'time': u'0.002', u'sql': u'SELECT "library_author"."id", "library_author"."name" FROM "library_author" LIMIT 21'}]
但是使用起来好像不是很方面。
在shell命令行的环境下,可以使用 django-exension’s shell_plus 命令并打开 –print-sql 选项。
python manage.py shell_plus --print-sql
>>> Author.objects.all()
SELECT "library_author"."id", "library_author"."name" FROM "library_author" LIMIT 21
Execution time: 0.001393s [Database: default] <QuerySet [<Author: Author object>]>
还有个更方面的方式, 使用 Django-debug-toolbar 工具,就可以在web端查看SQL查询的详细统计结果,其实它功能远不止这
个。
总结下总结下3个方式个方式
django.db.connection django自身提供,比较底层
django-extensions 可以在shell环境下方面调试
django-debug-toolbar 可以在web端直接看到debug结果
案例案例
下面是用个具体的例子来说明一些问题
model 定义定义
很经典的外键关系, Author 和 Book 一对多的关系
class Author(models.Model):
name = models.TextField()