【问题标题】:How to temporarily disable Django indexes (for SQLite)如何暂时禁用 Django 索引(用于 SQLite)
【发布时间】:2020-07-30 21:01:32
【问题描述】:

我正在尝试从大约 500 个较小的数据库(每个 50-200MB)创建一个大型 SQLite 数据库以放入 Django,并希望加快此过程。我正在通过自定义命令执行此操作。

This answer 帮助了我很多,将处理较小数据库的速度降低到大约一分钟。不过还是蛮久的。

我在那个答案中没有做的一件事是禁用 Django 中的数据库索引并重新创建它们。我认为这对我来说很重要,因为我的数据库很少有很多行的表。

有没有办法在 Django 实时运行时做到这一点?如果不在 Django 中,那么可能有一些 SQLite 查询来删除所有索引并在我插入记录后重新创建它们?

【问题讨论】:

    标签: django sqlite optimization orm bulkinsert


    【解决方案1】:

    我只是使用原始 SQL 删除索引并重新创建它们。这提高了从我的 2 个小数据库创建大数据库的速度从 1:46 到 1:30,非常重要。它还将大小从 341.7MB 减少到 321.1MB。

    # Delete all indexes for faster database creation
    with connection.cursor() as cursor:
        cursor.execute(f'SELECT name, sql FROM sqlite_master WHERE name LIKE "{app_label}_%" AND type == "index"')
        indexes = cursor.fetchall()
        names, create_sqls = zip(*indexes)
        for name in names:
            cursor.execute(f'DROP INDEX {name}')
    

    创建数据库后重新创建索引:

    # Re-create indexes
    with connection.cursor() as cursor:
        for create_sql in create_sqls:
            cursor.execute(create_sql)
    

    【讨论】:

    • 嗨@simonzack。您的意思是您的插入时间从 1 小时 46 分钟减少到 1 小时 30 分钟?这似乎不是一个巨大的改进(尽管您的要求可能有所不同)。您是否从链接到的答案中分享了使用方法 1 和 2 的近似改进?谢谢,
    • 嗯,我想我的意思是它从 1 分 46 秒下降到 1 分 30 秒。因此,如果将其乘以 500 / 2(对于 500 个小型数据库),即为 7:21:40 到 6:15:00,因此可以节省 1 小时。对于我链接到的答案,根据我过去的信息,PRAGMA journal_mode = MEMORY 的时间从 2 分 58 秒下降到 2 分 34 秒。执行PRAGMA cache_size = 100000 可将其加速至 1 分 51 秒。使用内存中的数据库而不是临时表将其速度提高到 1 分 46 秒。
    • 谢谢。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2015-10-13
    • 2011-09-03
    • 2011-07-03
    • 2015-02-24
    • 2011-06-13
    相关资源
    最近更新 更多