gpt4 book ai didi

Django:select_related() 的用法和执行时间性能

转载 作者:行者123 更新时间:2023-12-03 19:41:55 30 4
gpt4 key购买 nike

我是 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)

在我的模板中,我需要在评论标题旁边显示用户的简称。我的测试数据库大小有 1000 个用户和 19000 条评论。

起初,我按如下方式检索列表:
cmt_list = Comment.objects.all().order_by('title')

我的模板正在访问 short外键关系,这对数据库造成了额外的命中。检索所有数据需要 ~30s .这太可怕了。

我知道这比原始 SQL 快得多,我不知道如何通过 Django ORM 做到这一点。所以,我使用了低级接口(interface):
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]

检索所有数据需要 ~233ms .这就是我所期待的!

在阅读了更多文档后,我发现了 select_related() Django 中的功能。
所以,我试过了:
cmt_list = Comment.objects.all().select_related('short__short').order_by('title')

检索所有数据需要 ~1.3s .比原来的要好得多,但与原始 SQL 查询相比仍然很慢。

问题

我在使用 select_related()/Django ORM 的方式上做错了什么?我知道 ORM 会增加一些开销,但是 1.3s 与 233ms 似乎过多。或者,这是预期的,我只需要克服它?

我将如何使用与我所做的原始 SQL 查询等效的 ORM 来设计查询?鉴于我对 select_related() 的了解,我的原始 SQL 查询和我的 Django 查询应该大致相同。 (Django 查询将获取更多内容,但对于我的测试数据,不会检索到太多额外内容。)

最佳答案

实际上,ORM 会导致相当多的开销。以下语句产生相同的查询(您可以通过比较 str(cmt_list.query) 来检查它):

cmt_list1 = Comment.objects.all()
cmt_list2 = Comment.objects.values('id', 'title', 'content', 'short_id')

但是,使用 timeit.timeit 的简单测试(在我的本地项目中使用不同的模型)显示第二种方法比第一种方法快两倍多。

那个,不要忘记 TextFieldint 相比,数据量巨大。或 varchar(255)柱子。我敢肯定,如果您获取 content在原始 sql 查询中的列,数字会更接近。

关于Django:select_related() 的用法和执行时间性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27757925/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com