【问题标题】:Postgresql performance and DjangoPostgresql 性能和 Django
【发布时间】:2013-06-10 17:52:11
【问题描述】:

我的问题是一般性的,因为我正在寻找有关在 PostgreSQL 上使用具有以下特征的查询的最佳方式的建议:

  • 客户端间隔 5 秒
  • 每个查询结果超过 5000 条记录
  • 结果集是四个连接表
  • 结果集将显示在谷歌地图上

很可能视图比使用简单的 SQL 或存储过程更好。目前我使用的是普通的 AJAX 请求,我的 AJAX 代码是:

def request_positions(request):
    try:
        vehicles = Vehicle.objects.filter(registration__in = simplejson.loads(request.GET['vehicles']))
    except MultiValueDictKeyError:
        vehicles = Vehicle.objects.all()
    points = []

    for vehicle in vehicles:
        point = {
                'vehicle' : vehicle.registration, 
                'imei': None,
                'latitude': None, 
                'longitude':None,
                'course': None,
                'speed': None,
                'mileage': None,
                'gps_signal': None,
                'gsm_signal': None,
                'alarm_status': None,
                'gps_satus': None,
                'vehicle_status': None,
                'alarm_over_speed': None,
                'other': None,
                'date_time_process': None,
           }
        try:
            vehicledevice = vehicle.vehicledevice_set.get(is_joined__exact = True)
            try:
                track = vehicledevice.device.devicetrack_set.exclude(date_time_process__isnull = True).latest('date_time_process')
                point['imei'] = vehicledevice.device.imei
                point['latitude'] = track.latitude 
                point['longitude'] =track.longitude
                point['course'] = track.course
                point['speed'] = track.speed
                point['mileage'] = track.mileage
                point['gps_signal'] = track.gps_signal
                point['gsm_signal'] = track.gsm_signal
                point['alarm_status'] = track.alarm_status
                point['gps_status'] = track.gps_status
                point['vehicle_status'] = track.vehicle_status
                point['other'] = track.other
                point['date_time_process'] = track.date_time_process.astimezone(tz.gettz()).strftime("%Y-%m-%d %H:%M:%S")
                points.append(point)
            except ObjectDoesNotExist:
                pass

        except ObjectDoesNotExist:
            pass
    json = simplejson.dumps(points)
    return HttpResponse(json, mimetype='application/json')

我的应用程序是一个跟踪器,它每 10 秒存储一次数据,大约 5000 个跟踪器使用一个扭曲的守护进程。然后,我需要一种在客户端无需额外加载的情况下快速获得答案的方法,如您所见,我正在使用常见的 django 定义,但我也希望尝试优化此查询以减少请求和回答时间.另外,网络和服务器的费用,我的意思是,为了得到最好的过程,最好的方式。

【问题讨论】:

  • 请发布查询。
  • 我已经用代码编辑了我的帖子,但是我试图避免代码粘贴试图寻找独立于代码的建议,我希望这可以帮助获得更好的帮助

标签: python django postgresql google-maps-api-3 django-models


【解决方案1】:

我根本不会在 PostgreSQL 中这样做(而且我是 HUGE PG 粉丝)。这些数据变化如此频繁,我会按车辆 ID 将其存储在 Redis 之类的东西中。您仍然可以将其存储在 PG 中以用于长期报告目的,但是对于这个特定的视图,您将很难让它表现得非常好。

如果你必须继续只使用 PG,这些东西会有所帮助:

  • 使用 only() 限制您的 Vechile QuerySet 以仅在此处获取您需要的字段。
  • 不要创建一个包含大量 None 的大字典,然后重置它们,而是更改代码以使用 track.get('', None) 填充“point”字典。也使您的代码更短/更清晰。
  • 确保您在“date_time_process”字段上有一个索引。
  • 如果您使用的是 Python 2.7,请不要使用 simplejson,stdlib json 现在实际上更快一些,并且 Django 在 Django 1.5 中放弃了对 simplejson 的支持
  • 对关系使用 select_related() 和/或 prefetch_related() 以将它们作为 Vehicle 查询集的一部分。
  • 绝对考虑使用视图或存储过程来加快速度。

【讨论】:

  • 当然,我需要保存我的数据以进行长期报告,而您告诉我的正是我正在寻找的,非常感谢您的回答
  • 我不明白的是“track.get('', None)”,你能给我更多的信息或网址吗,因为我一直在寻找它的成功
  • 小世界。弗兰克·怀尔斯(Frank Wiles)为我合作的公司做了一些咨询……人是个天才。
猜你喜欢
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2012-07-08
  • 2018-05-22
  • 2018-10-20
相关资源
最近更新 更多