我的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 |
+-----+-------------+------------+---------------------+
答案 0 :(得分:0)
我认为您可以在此处使用latest。例如:
Trucks.objects.filter(serial='tsr1801').latest('Datetime') # as per table
您遵循的解决方案已经是非常好的方案。即使您使用以下查询(例如您正在使用的查询):
Truck.objects.distinct('serial').order_by('serial', '-Datetime')
应该足够快。
因此,除了更改查询之外,您应该在其他地方查找。像更新indexes of your DB一样,使用cache来减少数据库命中率等