gpt4 book ai didi

django - 反向 Django 外键查找的复杂性

转载 作者:行者123 更新时间:2023-12-01 15:08:49 25 4
gpt4 key购买 nike

假设我有一个这样的模型:

    class Post(models.Model):
name = models.CharField(max_length=25, unique=True)

class Picture(models.Model):
post = models.ForeignKey(to=Post, ondelete=models.CASCADE)
image = models.ImageField()

现在假设我做一个这样的查询:
    p = Post.objects.get(name=foo)
images = p.picture_set.all()

现在第一个查询显然会搜索所有帖子以获取名称为 foo 的帖子。 .
但我想知道第二个。是否搜索所有 Picture在数据库表中查找所有具有 post=p的图片或者当我收到 p 时是否可用信息在第一个查询中?
因为如果是前者,那么我担心可扩展性问题。

最佳答案

But I would like to know about the second one. Does it search through all the Picture table in the database to find all the pictures that have post=p or is the information available when I get p in the first query?



简答 : 默认情况下是 ForeignKey添加索引,使检索非常快(值数量为对数,反向记录数量为线性)。

这取决于数据库是否在 ForeignKey 上构建索引。 .默认情况下,Django 会构造一个索引。这意味着它不仅存储表的行,而且还存储允许快速查找具有特定值的所有行的数据结构。

索引的实现可以依赖于数据库。在 MySQL 中,它默认使用 BTREE ,这意味着对于一个值的查找,大约需要 O(log n) 来获取集合,并且 O(k) 和 k 是具有该外键的项目数来检索所有。但是存在其他索引结构,例如某种散列表,它们甚至允许(稍微)更快的查找,尽管例如散列表在检索具有 ForeignKey 的所有元素时效率不高。小于给定的数字。

您还可以在其他列上添加索引,例如:
class Post(models.Model):
name = models.CharField(max_length=25, db_index=True, unique=True)

所以现在检索所有 Post具有给定名称的名称的对象也会运行得更快。

使用索引当然不是“免费的”:这意味着每次插入或删除记录时,索引也需要更改(通常这也需要 O(log n))。如果您通过更改外键的值来更新记录,那么该索引也需要更改。因此,索引提供了显着的加速,但应该旨在仅将索引放在经常执行查找的列上,否则“维护”索引的成本可能大于加速查找过程的 yield 。

关于django - 反向 Django 外键查找的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53031086/

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