作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Django 和数据库的新手,所以我试图对性能有所了解。具体来说,我想了解 select_related()
正在按照我认为的方式工作。
这是我的模型的简化版本:
class User(models.Model):
short = models.CharField(max_length=255)
name = models.CharField(max_length=255)
class Comment(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
short = models.ForeignKey(User)
cmt_list = Comment.objects.all().order_by('title')
short
外键关系,这对数据库造成了额外的命中。检索所有数据需要
~30s .这太可怕了。
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT app_comment.title,app_user.short \
FROM app_comment,app_user \
WHERE app_comment.short_id=app_user.id \
ORDER BY app_comment.title"
)
raw_list = cursor.fetchall()
cmt_list = [ {"title":entry[0], "short":entry[1]} for entry in raw_list]
select_related()
Django 中的功能。
cmt_list = Comment.objects.all().select_related('short__short').order_by('title')
最佳答案
实际上,ORM 会导致相当多的开销。以下语句产生相同的查询(您可以通过比较 str(cmt_list.query)
来检查它):
cmt_list1 = Comment.objects.all()
cmt_list2 = Comment.objects.values('id', 'title', 'content', 'short_id')
timeit.timeit
的简单测试(在我的本地项目中使用不同的模型)显示第二种方法比第一种方法快两倍多。
TextField
与
int
相比,数据量巨大。或
varchar(255)
柱子。我敢肯定,如果您获取
content
在原始 sql 查询中的列,数字会更接近。
关于Django:select_related() 的用法和执行时间性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27757925/
我是一名优秀的程序员,十分优秀!