【发布时间】:2019-08-02 17:32:52
【问题描述】:
我有两段代码,都做同样的事情,但一个需要 50 秒,另一个需要不到 5 秒。
模型
class Device(models.Model):
device_uid = models.CharField(max_length=50, unique=True, null=False)
class DeviceReadings(models.Model):
device = models.ForeignKey(Device)
value = models.FloatField(default=0)
created_dt = models.DateTimeField()
class Meta:
unique_together = ('created_dt', 'device')
DeviceReadings 表包含大约 2 亿行。
如果我这样做,mysql 查询将不使用索引,将扫描 2200 万行,需要 40 秒。
#'D1,D2,D3' are comma separated device_uid's
my_devices = "D1,D2,D3".split(",")
devices = Device.objects.filter(device_uid__in=my_devices)
readings = DeviceReadings.objects.filter(created_dt__gte=start_time, created_dt__lte=end_time, device__in=devices)
但是,如果我这样做,mysql 查询将使用索引,并且只会扫描 100 万行,大约需要 4 秒。
my_devices = "D1,D2,D3".split(",")
my_devices_ob = Device.objects.filter(device_uid__in=my_devices)
devices = []
for device in my_devices_ob:
devices.append(device)
readings = DeviceReadings.objects.filter(created_dt__gte=start_time, created_dt__lte=end_time, device__in=devices)
如果我打印设备数组,这两个代码都是相同的。有人可以解释这里可能发生的事情吗?
【问题讨论】:
标签: mysql django django-orm