Я использую Django 2,1 , Python 3,6 и MySQL 8 .
В базе достаточно огромная таблица с большим количеством больших строк, поэтому перенос, примененный к этой таблице, занимает часы. Я обнаружил, что если я удалю полнотекстовый индекс из этой таблицы, он активирует inplace alghorithm таблицы модификации - это намного быстрее.
Так что мне нужно воспользоваться этим в Django. Я подумал об удалении полнотекстового индекса в качестве первой операции миграции и создании его снова после всех остальных операций.
operations = [
migrations.CreateModel(
name='NewModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
options={
'abstract': False,
},
),
migrations.RunSQL(
('DROP INDEX fulltext_idx_content ON summarizer_model',),
('CREATE FULLTEXT INDEX fulltext_idx_content ON summarizer_model(content)',),
),
migrations.AddField(
model_name='model',
name='new_model',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='new_models_objects', to='summarizer.new_model'),
),
migrations.RunSQL(
('CREATE FULLTEXT INDEX fulltext_idx_content ON summarizer_model(content)',),
('DROP INDEX fulltext_idx_content ON summarizer_model',),
),
]
(Я быстро анонимизировал приведенный выше фрагмент кода, поэтому, если есть какой-то логический ошибка, пожалуйста, извините - здесь не тот случай :))
Проблема в том, что Django миграция всегда помещает добавление ограничения ForeignKey в качестве последней операции. Итак, после моего последнего RunSQL
, который создает индекс обратно. Это делает его очень медленным (копирование всей таблицы с новым столбцом).
Есть ли способ преодолеть это? Думаю, было бы странно помещать другой файл миграции только для создания индекса. Я просто хочу временно удалить индекс на время миграции.
Спасибо