如何暂时禁用 Django 索引(对于 SQLite)
How to temporarily disable Django indexes (for SQLite)
我正在尝试从大约 500 个较小的数据库(每个 50-200MB)创建一个大型 SQLite 数据库以放入 Django,并希望加快此过程。我正在通过自定义命令执行此操作。
This answer 对我帮助很大,在处理较小的数据库时将速度降低到大约一分钟。不过时间还蛮长的。
我在该答案中没有做的一件事是在 Django 中禁用数据库索引并重新创建它们。我认为这对我很重要,因为我的数据库很少有很多行的表。
在 Django 运行 上线时,有没有办法在 Django 中做到这一点?如果不在 Django 中,那么可能有一些 SQLite 查询来删除所有索引并在我插入记录后重新创建它们?
我刚刚使用原始 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)
我正在尝试从大约 500 个较小的数据库(每个 50-200MB)创建一个大型 SQLite 数据库以放入 Django,并希望加快此过程。我正在通过自定义命令执行此操作。
This answer 对我帮助很大,在处理较小的数据库时将速度降低到大约一分钟。不过时间还蛮长的。
我在该答案中没有做的一件事是在 Django 中禁用数据库索引并重新创建它们。我认为这对我很重要,因为我的数据库很少有很多行的表。
在 Django 运行 上线时,有没有办法在 Django 中做到这一点?如果不在 Django 中,那么可能有一些 SQLite 查询来删除所有索引并在我插入记录后重新创建它们?
我刚刚使用原始 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)