提高Django中MySQL表创建的速度?

时间:2010-01-08 02:09:20

标签: mysql django performance unit-testing django-models

我的一些单元测试需要10-15秒才能创建表格。这似乎不必要地长。它必须创建大约50个表,但这仍然只有每秒3个表。在经常进行单元测试时,这是一个很大的烦恼。

作为一种解决方法,我一直在sqlite3中运行我的单元测试。它速度非常快,但我更喜欢在MySQL上运行我的测试,因为那是我的实时服务器运行的。

为了说明速度差异,请创建一个新项目。然后使用mysql在其上运行syncdb。然后使用sqlite3尝试它。

[~/testproject] ./manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

对我来说,在MySQL中创建上述表大约需要2秒钟。 Sqlite3几乎是即时的。

我在我的开发机器上运行mysql。这是我的my.cnf

请建议您可以考虑的任何提示或调整,这可能有助于加快MySQL的表创建时间。

4 个答案:

答案 0 :(得分:3)

您可以创建RAM磁盘并在那里移动数据库,仅用于单元测试。 如果你为此编写脚本,那么它是自动且非常方便的。

另外,出于其他目的,我编写了加载DB的自定义测试运行器 从sql dump而不是创建它然后创建表。

你选择。

答案 1 :(得分:1)

我发现使用sqlite替代使我的单元测试更快。我也正在删除southdb,因为这也会减慢表的创建速度。

if len(sys.argv) > 1 and sys.argv[1] == 'test':
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': ':memory',
            'USER': '',
            'PASSWORD': '',
            'HOST': '',
            'PORT': '',
        }
    }
    INSTALLED_APPS = tuple([x for x in INSTALLED_APPS if x != 'south'])

答案 2 :(得分:0)

我的INNODB表创建速度一直很慢(创建13个小表的时间约为25秒)。

我在my.cnf文件的[mysqld]部分中尝试了选项。

添加:

innodb_flush_method=fdatasync

产生了最好的结果(创建相同的13个小表约1.5秒)。

答案 3 :(得分:0)

仅在Mac OSX上,将以下内容添加到〜/ .my.cnf:

[mysqld]
skip-sync-frm=ON

对我来说,这改善了我的Django测试套件在MySQL上的启动时间从1分30秒到7秒!

详细信息: http://www.stereoplex.com/blog/speeding-up-django-unit-test-runs-with-mysql