首页 > 解决方案 > 如何进行查询以获取 Django ORM 中每个组的最后一个元素?

问题描述

我的 Postgresql 数据库中有一个 Truck 表。我每分钟写一个新数据。我想按序列获取每组的最新元素。但问题是我的数据库太大了,查询需要很长时间。现在我有 470000 行数据。我尝试进行查询:

rec_ = Trucks.objects.filter(serial='tsr1801').distinct('serial').order_by('serial', '-id')

它的反应这么慢。我尝试了如下所示的其他方法,但这些查询也运行缓慢。

1) https://stackoverflow.com/a/19930802/7456750

矿:Trucks.objects.annotate(max_id=Max('id')).filter(id=F('max_id'))

2) https://stackoverflow.com/a/17887296/7456750

矿:Trucks.objects.values('serial', 'payload', 'datetime').annotate(id=Max('id'))

有什么方法可以获取每个组的最新元素,效果很快吗?

+-----+-------------+------------+---------------------+
|  Id |   Serial    |  Payload   |     Datetime        |
+-----+-------------+------------+---------------------+
|  1  |   tsr1801   |   24432    | 2018-11-01 12:00:00 |
+-----+-------------+------------+---------------------+
|  2  |   tsr1802   |   20234    | 2018-11-01 12:01:00 |
+-----+-------------+------------+---------------------+
|  3  |   tsr1802   |   21234    | 2018-11-01 12:01:00 |
+-----+-------------+------------+---------------------+
|  4  |   tsr1801   |   24332    | 2018-11-01 12:02:00 |
+-----+-------------+------------+---------------------+
|  5  |   tsr1801   |   21532    | 2018-11-01 12:03:00 |
+-----+-------------+------------+---------------------+
|  6  |   tsr1802   |   19234    | 2018-11-01 12:02:00 |
+-----+-------------+------------+---------------------+
|  7  |   tsr1801   |   18040    | 2018-11-01 12:04:00 |
+-----+-------------+------------+---------------------+
|  9  |   tsr1801   |   27452    | 2018-11-01 12:05:00 |
+-----+-------------+------------+---------------------+

标签: djangodjango-modelsdjango-querysetdjango-ormdjango-database

解决方案


我想你可以在这里使用最新的。例如:

 Trucks.objects.filter(serial='tsr1801').latest('Datetime')  # as per table

更新

您遵循的解决方案已经是非常好的解决方案。即使您使用以下查询(如您正在使用的查询):

 Truck.objects.distinct('serial').order_by('serial', '-Datetime')

应该够快。

因此,您不应更改查询,而应寻找其他地方。就像更新数据库的索引,使用缓存来减少数据库命中等


推荐阅读