class A(models.Model)
results = models.TextField()
class B(models.Model)
name = models.CharField(max_length=20)
res = models.ManyToManyField(A)
A
模型有数百万个对象。我想知道什么是获取results objects
特定B
对象所有信息的最佳效率/最快方法。
5
为的所有结果B
Option 1 : A.objects.filter(b__id=5)
(OR)
Option 2 : B.objects.get(id=5).res.all()
A
模型对象上按ID过滤会花费很多时间吗?因为有数以百万计的A
模型对象。res
字段是否B
存储模型对象的id
值A
?我之所以选择该选项2
,是因为它存储了A
模型对象的引用并直接直接获取那些对象值,然后进行第二次查询以获取结果,因此是一种更快的方法。而在第一个选项中,按ID或任何其他字段进行过滤将占用大量时间
第一个表达式将导致一个数据库查询。确实,它将查询:
SELECT a.*
FROM a
INNER JOIN a_b ON a_b.a_id = a.id
WHERE a_b.b_id = 5
所述第二表达将导致2个查询。确实,首先Django将通过以下查询进行查询以获取该特定B
对象:
SELECT b.*
FROM b
WHERE b.id = 5
然后它将进行完全相同的查询以检索相关A
对象。
但是A
这里不需要检索对象(除非您当然需要在其他地方使用它)。因此,您进行了无用的数据库查询。
我的问题是在模型对象上按id过滤会花费很多时间吗?因为有数以百万计的A模型对象。
数据库通常在外键字段上存储索引。因此,这意味着它将有效过滤。A
对象的总数通常不相关(因为它使用像B树[wiki]这样的数据结构来加速搜索)。Wiki页面上有一个名为“索引加快搜索速度”的部分,它解释了该过程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句