Django фильтрует по полю DateTimeField очень медленно
Environment
- AWS RDS t3.micro (2 vCPU, 1GiB RAM)
- PostgreSQL 11.10
У меня есть более 15 миллионов записей Note
, модель которых выглядит следующим образом:
class Note(models.Model):
...
post_date = models.DateTimeField()
...
К вашему сведению, Note
имеет 35+ полей, некоторые из которых являются полями ManyToManyField
и ForeignKey
.
Проблема
start_time = time.time()
queryset = Note.objects.filter(
# post_date=datetime.now() - timedelta(days=6),
post_date__year=2021,
post_date__month__gt=7,
)[:100]
tmp = list(queryset)
print("Time elapsed: ", time.time() - start_time)
Приведенный выше код занимает всего 0,68 секунды, но если я откомментирую # postTs=datetime.now() - timedelta(days=6),
, то время увеличится до 55,53 секунды.
Для смягчения этой проблемы я рассматриваю возможность преобразования DateTimeField
в PositiveIntegerField
для хранения значений временных меток. Прежде чем сделать этот шаг, есть ли что-нибудь еще, что я могу попробовать? Почему это происходит?