如何临时禁用Django索引(对于SQLite)

问题描述 投票:0回答:1

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

This answer对我帮助很大,在处理较小的数据库时,将速度降低到每分钟约一分钟。但是,仍然有很长的时间。

我在该答案中尚未完成的一件事是在Django中禁用数据库索引并重新创建它们。我认为这对我很重要,因为我的数据库很少有很多行的表。

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

django sqlite optimization orm bulkinsert
1个回答
0
投票

我只是使用原始SQL删除索引并重新创建它们。这将我的两个小型数据库中创建大型数据库的速度从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)
© www.soinside.com 2019 - 2024. All rights reserved.