Есть модель, в ней
8 простых полей (int, char),
2 Forein key,
1 many to many
2 JSONField (по 100 ключей каждый)
Сейчас там 5000 записей и скорость получения сильно растет (1 объект - 0,15сек., в начале было 0,04). Есть идея вынести JSONField в отдельные модели, но иногда все равно придется мерджить . Есть какие-то еще варианты оптимизации?
Dr. Bacon, я писал конкретно про get запрос, MyModel.objects.get(custom_id=123) Сергей Горностаев они сначала были пустые ({}), скорость упала после наполнения
Александр, и тем не менее я рекомендую посмотреть профиль выполнения. Если много времени уходит на обработку запроса базой, то смотреть, что это за запрос, почему он именно такой, какой по нему план выполнения и почему, а отталкиваясь от полученных данных уже браться за оптимизацию.
Я был бы рад, что скорость растет(сначала я думал вы опечатались, но потом вы повторились.)
У вас не скорость растет, а время выполнения запроса растет...
QUERY PLAN
Index Scan using scrap_match_match_i_e8e4d4_idx on scrap_matchesfull (cost=0.28..8.30 rows=1 width=1046) (actual time=0.023..0.023 rows=1 loops=1)
Index Cond: (match_id = 11878509)
Planning Time: 0.728 ms
Execution Time: 0.097
Александр, Единственное, что у вас с полями json, может быть после отдачи они как-то конвертируются в dict? Тогда да, на каждое json-поле еще нужно отпарсить в приложении, вот и вземя на это тратится. Старайтесь выбирать только те поля, которые используете, а не всю строку тащить из базы.
Александр, сделайте отдельную таблицу один-к-одному и в ней держите ваши jsonfield. Когда нужно, отдельными (под)запросами будете доставать тяжелые данные.
Александр, я так понимаю, пользуетесь этим? - https://pypi.org/project/django-json-field/
Тогда да, у вас каждое jsonfield еще десеарилизуется. Но вроде бы по умолчанию они lazy, так что должны сами по подзапросам работать...
Алексей Черемисин, родной JSONField из джанги
Если исключить JSONField поля при получении объекта скорость снова падает до минимальной.
Буду исключать их просто
Делаешь две БД. И пишешь в одну все записи удовлетворяющие HASHCODE(primaryKeys, 2) == 0
а во вторую БД HASHCODE(primaryKeys, 2) == 1. При запросах соотв. делаешь запрос в две БД и объединяешь результат.