将数据导入MySQL时提高性能?

时间:2011-10-14 18:13:31

标签: python mysql xml django json

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

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

无论如何,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

2 个答案:

答案 0 :(得分:0)

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

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

现在运行你的构建过程:

settings.py

答案 1 :(得分:0)

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