Как ускорить агрегацию запросов Django в базе данных на 10 миллионов строк с 60 функциями? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть таблица базы данных в psql, которая содержит 10 000 000 строк и 60 столбцов (функций).Я определяю Django Queryset следующим образом:

MyQ=MyDataBase.objects.filter(Name='Mike', date=date(2018, 2, 11), 
Class='03')

Есть только 5 строк, которые удовлетворяют вышеуказанному фильтру.Но когда я пытаюсь что-то наподобие

MyQ.count() #which equals 5

или

MyQ.aggregate(Sum('Score'))['Score__sum'] #which equals 61

, каждый из них занимает около 3 минут, чтобы дать мне результат.Разве это не странно?Разве наборы запросов не должны облегчать жизнь, сосредотачиваясь только на тех строках, на которых мы им указали?подсчет 5 строк или суммирование одного из них не должно занимать много времени.Что я делаю не так?

Я тоже должен это сказать.В первый раз, когда я попробовал этот код на этой таблице, все было хорошо, и потребовалось, возможно, 1 секунду, чтобы поймать результат, но теперь эти 3 минуты действительно раздражают.И с тех пор я ничего не изменил в базе данных или коде.

1 Ответ

0 голосов
/ 15 февраля 2019

Как правило, если вы фильтруете свою таблицу по определенному полю или количеству полей, вы должны создать индекс для этих полей.Это позволяет планировщику запросов к базе данных выбирать более оптимизированный путь при поиске / сортировке.

Похоже, вы используете Postgres из своего вопроса, поэтому вы можете запустить SELECT * FROM pg_indexes WHERE tablename = 'yourtable'; в psql, чтобы увидеть любые существующие индексы.

Django может создать эти индексы для вас в определении вашей модели.Например, ваша модель MyDatabase может выглядеть примерно так:

class MyDatabase(models.Model):
    name = models.TextField(index=True)
    date = models.DateField(index=True)
   class = models.TextField(index=True)

Вот еще некоторые подробности, относящиеся к созданию индексов для моделей Django: gun.io / blog / learn-indexing-dammit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...