Массовая модель Django с индексами

Я недавно удалил более 2 миллионов строк из моей базы данных, используя это (я хотел очистить любую историю пользователей, где пользователь больше не существует). Я использую Джанго простую историю.

active_ids = User.objects.values_list("id", flat=True)
User.history.filter(~Q(id__in=active_ids)).delete()

Это заняло около 5 минут и удалило все строки, которые я хотел. Однако до того, как я запустил операцию, размер моего стола составлял около 900 МБ. После удаления строк это все еще 700 МБ - намного больше, чем я ожидал. При дальнейшей проверке кажется, что размер index_length этой таблицы все еще велик и составляет 424 МБ. Я не думаю, что это вообще пошло на убыль.

Уменьшается ли когда-либо этот размер индекса? Модель User имеет несколько db_indices, таких как id, username и email.

2 ответа

Решение

Это проблемы MySQL, а не проблемы Django.

Медленное удаление.

В любой СУБД, будь то mysql или postgresql или что-либо еще, массовая вставка, удаление и обновление всегда будут медленными, если у вас есть индексы. Это природа зверя.

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

Как обычный пользователь postgresql, я вас уверяю, что это не является достаточной причиной, чтобы переключиться на postgreql из mysql. Если вы посмотрите на более широкую картину и все другие факторы, безусловно, postgresql лучше, но не позволяйте этой проблеме быть решающим фактором.

Восстановить удаленное пространство

Если вы действительно не нуждаетесь в свободном пространстве на жестком диске, просто отпустите его. Это пространство будет повторно использоваться базой данных при дальнейшем увеличении таблицы. Если вы добавите два миллиона новых записей, вы обнаружите, что использование диска вообще не увеличилось.

Если вам действительно не хватает места. ОПТИМИЗИРУЙТЕ СТОЛ. Эта операция тоже займет много времени.

Я бы порекомендовал изменить управление базой данных. Вы можете перейти на PostgreSQL, поскольку он создан для хранения больших объемов данных. Или вы можете попробовать большие данные. На тот случай, если ваши данные действительно станут очень большими. Удаление данных не очень рекомендуется, так как вы можете использовать их позже для аналитики.

Вы можете попробовать django и cassandraDB, например. https://github.com/r4fek/django-cassandra-engine

Другие вопросы по тегам