代码之家  ›  专栏  ›  技术社区  ›  Gattster

在Django中加快mysql表的创建速度?

  •  6
  • Gattster  · 技术社区  · 14 年前

    我的一些单元测试只需要10-15秒,MySQL就可以创建这些表。这似乎太长了。它必须创建大约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 回复  |  直到 12 年前
        1
  •  3
  •   Tomasz Zieliński    14 年前

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

    另外,为了其他目的,我编写了加载数据库的自定义测试运行程序 从SQL转储而不是创建它,然后创建表。

    你选择。

        2
  •  1
  •   Gattster    12 年前

    我发现使用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'])
    
        3
  •  0
  •   Stacey Richards    14 年前

    我一直在经历缓慢的InnoDB表创建速度(大约25秒创建13个小表)。

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

    添加:

    innodb_flush_method=fdatasync
    

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

        4
  •  0
  •   Jonathan Hartley Zombie    12 年前

    仅在Mac OSX上,将以下内容添加到您的~/.my.cnf中:

    [mysqld]
    skip-sync-frm=ON
    

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

    详情如下: http://www.stereoplex.com/blog/speeding-up-django-unit-test-runs-with-mysql