【发布时间】:2018-10-11 06:18:13
【问题描述】:
我每 5 秒收到大约 5000 种工具的财务数据,需要更新数据库中的相应条目。模型如下:
class Market(models.Model):
market = models.CharField(max_length=200)
exchange = models.ForeignKey(Exchange,on_delete=models.CASCADE)
ask = models.FloatField()
bid = models.FloatField()
lastUpdate = models.DateTimeField(default = timezone.now)
需要发生的事情如下:
- 收到新的财务数据后,检查是否存在条目 数据库。
- 如果条目存在,请更新 ask、bid 和 lastUpdate 字段
- 如果该条目不存在,则创建一个新条目
我的代码如下:
bi_markets = []
for item in dbMarkets:
eItem = Market.objects.filter(exchange=item.exchange,market=item.market)
if len(eItem) > 0:
eItem.update(ask=item.ask,bid=item.bid)
else:
bi_markets.append(item)
#Bulk insert items that does not exist
Market.objects.bulk_create(bi_markets)
但是执行此操作需要的时间太长。大约 30 秒。我需要将时间减少到 1 秒。我知道这可以在 100 毫秒内完成,就像我在 .NET 中使用自定义 SQL 代码一样。知道如何提高 Django 的性能吗?
【问题讨论】:
-
尝试为
market和exchange字段添加db_index=True。 -
为什么不使用
exists = Model.objects.filter(category='django').exists()将有助于减少一次检查并尝试使用值获取dbmatrkets。我的意思是像这样dbmarkets = Model.objects.value('value1','value2')。这将减少您的查询时间。 -
添加索引并没有提高性能
-
使用 exists() 将增加额外的运行时间层,因为 99.9% 的项目将存在于表中
-
不,不会的。这将是对调用
COUNT()的len()的(轻微)优化。
标签: django python-3.x django-models django-database