Django 大规模更新/插入性能



我每 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)

需要发生的是:

  • 收到新的财务数据后,检查 数据库。
  • 如果该条目存在,请更新"要价"、"出价"和"最后更新"字段
  • 如果该条目不存在,请创建一个新条目

我的代码如下所示:

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 秒。 我知道这可以完成,因为我在 .NET 中在 100 毫秒内执行相同的自定义 SQL 代码。 知道如何提高 Django 的性能吗?

如果你想要的是这种性能,我不明白你为什么不直接分解为原始SQL。批量创建尚不存在的东西听起来像是 Django 并不是真正为之而生的高级 SQL 查询。

https://docs.djangoproject.com/en/2.0/topics/db/sql/

你也可以做(对不起在手机上(:

bi_markets = []
for item in dbMarkets:
rows = Market.objects.filter(exchange=item.exchange, market=item.market).update(ask=item.ask, bid=item.bid)
if rows == 0:
bi_markets.append(item)
Market.objects.bulk_create(bi_markets)

也许这种组合会生成一些更好的 SQL,并且它也回避了exists()调用(update返回它更改了多少行(。

我决定拆分更新并创建功能。 创建仅在应用程序启动时发生,从那里我使用自定义SQL脚本进行更新。 见下文。 工作很棒。

updateQ = []
updateQ.append("BEGIN TRANSACTION;")
for dbItem in dbMarkets:
eItem = tickers[dbItem.market]
qStr = "UPDATE app_market SET ask = " + str(eItem['ask']) + ",bid = " + str(eItem['bid']) + " WHERE exchange_id = " + str(e.dbExchange.pk) + " AND market = " + '"' + dbItem.market + '";'
updateQ.append(qStr)
updateQ.append("COMMIT;")
updateQFinal  = ''.join(map(str, updateQ))
with connection.cursor() as cursor:
cursor.executescript(updateQFinal)

最新更新