У меня есть два фрагмента кода, оба выполняют одно и то же, но один занимает 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 содержит около 200 миллионов строк.
Если я это сделаю, MySQL запрос не будет использовать индекс и будет сканировать 22 миллиона строк и займет 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 запрос будет использовать индекс и будет сканировать только 1 миллион строк и занимает около 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)
Если я распечатываю массив устройств, он одинаков в обоих кодах.Может кто-нибудь объяснить, что здесь может происходить?