【问题标题】:Speed up Django Migrations on Large Database加快大型数据库上的 Django 迁移
【发布时间】:2020-08-24 06:25:19
【问题描述】:

我有一个 MySQL 数据库,其中包含多个表,每个表都有近 2M 条记录。当我运行更新这些表的迁移时,它非常慢。我尝试将服务器增强到 64 个 CPU 和 240GB RAM(可能真的没必要),但仍然需要很长时间。

有什么方法可以加快迁移速度?

编辑:正如@iklinac 所指出的,我看到这篇文章是关于创建一个新的临时表,然后将数据从旧表迁移到这个新表。有没有“Django 方式”来做到这一点?

【问题讨论】:

  • 问题是,如何更新这些表。如果不知道您进行了哪些迁移,则无能为力。
  • @WillemVanOnsem “不知道你做了什么迁移”是什么意思?你的意思是我不知道迁移会做什么样的更新?
  • 不,我的意思是您共享迁移。例如,如果您通过循环执行数据迁移,则确实需要数年时间,但可以使用.update(..) 来提升它。但是您只是说“我有一个迁移”,所以对于这个特定的迁移,我们无法提供太多帮助。
  • @WillemVanOnsem 哦,我明白了。我拥有的迁移都是来自 manage.py makemigrations 的 Django 自动生成的迁移,它添加和更改表的字段。我没有对迁移文件进行任何手动更新。这有帮助吗?
  • @JudeMaranga:迁移被转换为 SQL 查询。你用manage.py sqlmigrate appname migrationname检查这些。它将打印它将在数据库上执行的 SQL 查询。

标签: mysql django django-migrations


【解决方案1】:

您可以通过 writing migrations 在 Django 迁移中运行 SQL 查询,或者使用 RunSQL 操作自己编辑迁移文件

类 RunSQL(sql, reverse_sql=None, state_operations=None, hints=None, 可省略=假)

允许在数据库上运行任意 SQL - 对于 Django 的数据库后端的更高级功能很有用 不直接支持。

使用 state_operations 参数

state_operations 参数允许您提供以下操作 在项目状态方面相当于 SQL。例如,如果您 正在手动创建一列,您应该传入一个包含 此处的 AddField 操作,以便自动检测器仍然具有 模型的最新状态。如果没有,下次运行时 makemigrations,它不会看到任何添加该字段的操作,因此 将尝试再次运行它。例如:

migrations.RunSQL(
    "ALTER TABLE musician ADD COLUMN name varchar(255) NOT NULL;",
    state_operations=[
        migrations.AddField(
            'musician',
            'name',
            models.CharField(max_length=255),
        ),
    ],
)

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2011-09-10
    • 2016-02-10
    • 2018-03-04
    • 2017-05-06
    • 2014-07-30
    • 1970-01-01
    • 2014-01-13
    • 2014-07-05
    相关资源
    最近更新 更多