祝新年快乐!
我有一个可以容纳数十万条记录的模型。该模型如下所示:
class Transaction(models.Model):
user = models.ForeignKey(User)
client = models.ForeignKey(Client)
amount = models.FloatField()
我想知道某个用户正在处理的所有客户。为了获得唯一的客户端ID,我可以单独使用Django ORM:
Transaction.objects.filter(user=the_user).distinct('client_id').values_list('client_id', flat=True)
或执行以下操作:
set(Transaction.objects.filter(user=the_user).values_list('client_id', flat=True))
两者都会产生相同的结果。但鉴于大量记录,哪一个会更快?我知道distinct
对数据库的操作相对较慢,但它与python的set()
的比较是什么?
最后,如果它归结为数据库,我的选项是MySql和PostgreSql用于生产。对于这个特定的操作,两者之间是否会有任何区别?
答案 0 :(得分:5)
我通常使用orm函数,它更具可读性并且在数据库级别运行,因此您的RDBMS实际上是计算不同的值,并且您只需一步即可得到结果。
您可以使用python集完成相同的操作,但您需要首先使用所有数据集,然后应用set()。因此,您必须执行两步操作才能执行相同的操作。
在你的第一种情况下(orm)你只有I / O开销,在第二种情况下,你有I / O开销+一个函数调用,所以我会选择ORM的不同。