Место, занятое удаленными строками, снова используется?

1) То, что вы хотите сделать, противоречит тому, как работает Django, и приведет к большей боли, чем оно того стоит. Я бы порекомендовал сделать prefetch_related как предложено. Вы также можете изучить следующее. Вот документы на ManyToManyField .

class Item(models.Model):
    name = models.CharField(max_length=100)

class Group(models.Model):
   name = models.CharField(max_length=100)
   items = models.ManyToManyField(Group, through='ItemGroup')

class ItemGroup(models.Model):
   item = models.ForeignKey(Item, on_delete=models.CASCADE)
   group = models.ForeignKey(Group, on_delete=models.CASCADE)

2) Взгляните на ListField . Я думаю, что это должно помочь вам достичь того, что вы хотите там.

23
задан Lightness Races with Monica 8 December 2011 в 16:23
поделиться

2 ответа

Это - паранойя:)

дБ не увеличиваются в размере излишне, но для проблем производительности пространство не освобождено также.

то, Что Вы услышали по всей вероятности, то, что, если Вы удаляете записи, что пространство не отдано к Операционной системе . Вместо этого это сохранено как вакуум для DB к повторному использованию впоследствии.

Это вызвано тем, что:

  • дБ должен иметь некоторое пространство HD для сохранения его данных; если это не имеет никакого пространства, это резервирует некоторый вакуум сначала.
  • при вставке новой строки часть того пространства используется.
  • , Когда у Вас заканчивается свободное пространство, новый блок резервируется и так далее.
  • Теперь, при удалении некоторых строк для предотвращения резервирования все большего количества блоков, его пространство сохранено свободным, но никогда не отдаваемым к Операционной системе, таким образом, можно использовать его снова позже без любой потребности резервирования новых блоков.

, Как Вы видите, расположите с интервалами , снова использованы, но никогда не отданы. Это - ключевой пункт к Вашему вопросу.

32
ответ дан 29 November 2019 в 02:25
поделиться

В innodb нет практического способа освободить пространство.

  • использовать для каждой таблицы файл ibdata, который позволит вам удалить записи, скопировать данные в новую таблицу и удалить старую таблицу, восстанавливая таким образом записи.
  • использовать mysqldump и множество рецептов для очистки всего сервера. Проверьте следующее:
    http://dev.mysql.com/doc/refman/5.0/ru/adding-and-removing.html

Все эти методы становятся непрактичными, когда вы используете огромные таблицы (в моем случае они больше 250 ГБ), и вы должны сохранять их, удаляя записи, чтобы повысить производительность.

Вам придется серьезно подумать, достаточно ли у вас места на жестком диске для выполнения одной из вышеуказанных функций (в моем случае я не думаю, что 1 ТБ достаточно для всех этих действий)

с таблицей Innotab (и самой mysql) опция довольно ограничена, если у нее серьезный размер базы данных.

2
ответ дан 29 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: