gpt4 book ai didi

python - 我怎样才能加快这个 Django 查询?

转载 作者:行者123 更新时间:2023-11-29 12:56:50 24 4
gpt4 key购买 nike

我的数据库中有将近 200 万条记录,其中很多是重复的(不同的内部 ID 但相同的“idd”)

基本上我需要的是查询数据库以获取只有 1 个产品(不同 idd)并按 '-sold_count' 排序的前 x 条记录

所以这是我正在尝试的查询:

Product.objects.distinct('idd').order_by('idd', '-sold_count')[:2000]

问题 1:这大约需要 30 秒,而且我担心随着数据的增加,它会花费更长的时间。我怎样才能让它更快?

问题 2:它也没有按 sold_count 降序排列,如果有的话,它似乎在做相反的事情。如何按-sold_count 订购?尝试删除“-”进行实验,但结果似乎相同。

其他信息:

idd 是一个 CharField

sold_count 是一个 IntegerField

希望这已经足够清楚了,如果还不清楚,您可以提出任何问题。

模型:

class Product(models.Model):
price = models.FloatField(default=False, null=True)
sold_count = models.IntegerField(default=False, null=True)
revenue = models.FloatField(default=False, null=True)
idd = models.CharField(max_length=300, default=False, null=True)
remaining = models.IntegerField(default=False, null=True)
category = models.CharField(max_length=300, default=False, null=True)
brand = models.CharField(max_length=300, default=False, null=True)
seller = models.CharField(max_length=300, default=False, null=True)
url = models.CharField(max_length=300, default=False, null=True)
name = models.CharField(max_length=300, default=False, null=True)
shipment = models.CharField(max_length=300, default=False, null=True)
view_count = models.IntegerField(default=False, null=True)
updated = models.DateTimeField(null=True)

已发送原始查询:

SELECT DISTINCT ON ("server_gitti"."idd") "server_gitti"."id", "server_gitti"."price", "server_gitti"."sold_count", "server_gitti"."revenue", "server_gitti"."idd", "server_gitti"."remaining", "server_gitti"."category", "server_gitti"."brand", "server_gitti"."seller", "server_gitti"."url", "server_gitti"."name", "server_gitti"."shipment", "server_gitti"."view_count", "server_gitti"."updated" FROM "server_gitti" ORDER BY "server_gitti"."idd" ASC, "server_gitti"."sold_count" ASC LIMIT 2000

最佳答案

好吧,如果我知道我要搜索 TextFieldCharField 列,我要做的第一件事就是设置一个索引:

class Product(models.Model):
price = models.FloatField(default=False, null=True)
sold_count = models.IntegerField(default=False, null=True)
revenue = models.FloatField(default=False, null=True)
idd = models.CharField(max_length=300, default=False, null=True, db_index=True)
remaining = models.IntegerField(default=False, null=True)
category = models.CharField(max_length=300, default=False, null=True)
brand = models.CharField(max_length=300, default=False, null=True)
seller = models.CharField(max_length=300, default=False, null=True)
url = models.CharField(max_length=300, default=False, null=True)
name = models.CharField(max_length=300, default=False, null=True)
shipment = models.CharField(max_length=300, default=False, null=True)
view_count = models.IntegerField(default=False, null=True)
updated = models.DateTimeField(null=True)

Django rocks uses a 2000 row example, entertainingly

您可能还想看看 SQL that Django's running - 如果您在该类(或相关类)上有额外的方法,您可能会触发比您意识到的更多的 SQL 查询。从表面上看,您的查询非常简单,但看起来很慢。我对几百万条记录进行了连接,这些记录在我们糟糕的遗留数据库中花费了那么长时间。 I also had a similar issue on get_or_create queries on a database这两种大小之间的推文,这是通过索引解决的。

编辑:应该添加 standard django docs on optimisation其中还有一些需要注意的地方。

Edit2:看起来 select distinct 通常相当慢,并且是 postgres 上的一个已知问题。通过连接查询调试是likely to yield some interesting results , 尽管。

关于python - 我怎样才能加快这个 Django 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41119050/

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