【问题标题】:Improve performance when importing data to MySQL?将数据导入 MySQL 时提高性能?
【发布时间】:2011-12-07 23:28:57
【问题描述】:

我正在使用 Django 构建一个带有 MySQL (MyISAM) 后端的网站。

数据库数据是从多个 XML 文件导入的,这些文件由外部脚本处理并输出为 JSON 文件。每当一个新的 JSON 文件与旧的不同时,我需要擦除旧的 MySQL-db 并使用 manage.py loaddata 重新创建它,(至少这是最简单的方法,我想我可以检查 JSON 之间的差异文件并将它们应用到数据库,但我还没有找到一个好的解决方案(我既不是一个很好的编码器也不是一个网络开发人员)。

无论如何,JSON 文件大约 10 Mb,最终大约有 21,000 行 SQL(预计不会显着增长)。有 7 个表,它们看起来都像这样:

class Subnetwork(models.Model):
   SubNetwork = models.CharField(max_length=50)
   NetworkElement = models.CharField(max_length=50)
   subNetworkId = models.IntegerField()
   longName = models.CharField(max_length=50)
   shortName = models.CharField(max_length=50)
   suffix = models.CharField(max_length=50)

将其导入 MySQL 最多需要一分钟(有时只需 30 秒)。我不知道这种大小的文件是否会出现这种情况?我可以做些什么(如果有的话)来提高性能?

对于它的价值,这里有一些分析器输出https://gist.github.com/1287847

【问题讨论】:

  • 确保 settings.py 中的 DEBUG=False。我有一个 300mb 的文件要导入,它通常会运行一个小时左右并失败。我更改了 DEBUG,它在 30 分钟内开始运行并完成。当 DEBUG=True 时,ORM 使用更多内存来缓存查询...
  • 这将加载时间缩短了几秒钟。我想这是一个好的开始,谢谢。

标签: python mysql xml django json


【解决方案1】:

有几个解决方案,与其他解决方案一样好,但这里有一个解决方法,可以使系统的“停机时间”最小化,而无需编写数据库同步机制(在大多数情况下这可能是一个更好的解决方案)。 :

  • 创建一个自定义settings_build.py 文件,使用from settings import * 为新数据库选择一个随机名称(可能在数据库名称中包含日期),通过调用mysqladmin 创建它,并将名称更新为DATABASES
  • 通过克隆loaddata命令或调用它来创建custom django management command(我们称之为builddb),如果成功,它应该将db名称写入dbname文本文件,其中包含一行和执行一个 shell 命令来重新加载你的 django (apache/gunicorn/?) 服务器。
  • 修改您的settings.py 以从文本文件中加载数据库名称。

现在像这样运行您的构建过程:

./manage.py builddb --settings=settings_build

【讨论】:

  • 这是我考虑过的一个选项(即为每次导入创建一个新数据库),但不幸的是我没有完全访问 MySQL 服务器的权限,只能使用我自己的数据库'已被分配。
  • 如果您可以访问多一个db,您仍然可以通过交替两个db来使用此方法。
  • 是的。如果我没有想出真正减少时间的方法,我可能会将此作为最后的手段。
【解决方案2】:

我通过将处理后的 XML 文件导出到 csv 而不是 json 来解决这个问题,然后使用名为 mysqlimport 的单独脚本进行导入。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2012-04-11
    • 2016-10-24
    • 2011-12-26
    • 2010-10-01
    相关资源
    最近更新 更多