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

6

我的一些单元测试仅为MySQL创建表格就需要花费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表格创建时间。


你的MySQL表是本地的还是远程的? - Martin
它是在我的Mac本地的。如果您愿意,请查看我的my.cnf:http://pastebin.com/m69af8ba3 - Gattster
1
我更喜欢在MySQL上运行我的测试。为什么?你不信任Django的ORM层吗? - S.Lott
我有一些执行原始 SQL 以提高性能的代码。这个原始 SQL 只在 MySQL 中有效。还有其他有效的用例,比如如果你使用了 MySQL 的全文搜索功能。 - Gattster
1
@andybak - 我几乎可以确定除了新的settings.py之外别无他法。如果Django有一种指定完全不同的数据库设置进行测试的选项,那将非常好,但它似乎没有。 - Dominic Rodger
显示剩余2条评论
4个回答

3

您可以创建RAM磁盘并将数据库移动到其中,仅用于单元测试。如果您编写脚本,则可以自动化并且非常方便。

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

由您选择。


我从未在 RAM 磁盘上运行过 MySQL,但我认为只需在不同的端口上设置一个新的 MySQL 守护进程,并将其数据目录指向 RAM 磁盘即可。感谢您的建议。 - Gattster
是的,您也可以只切换配置文件(指向 RAM 磁盘上的 db 路径)以针对现有的 MySQL 实例,然后重新启动它——无论哪种方法对您更好。 - Tomasz Zieliński
你是否曾经在 RAM 磁盘上运行过 MySQL 并看到了速度的提升?这似乎会有所帮助,但在测试之前你真的不知道。 - Gattster
是的,我已经亲自完成了这项工作,并获得了重大的速度提升(尽管我没有测量时间来获取确切数字)。 - Tomasz Zieliński

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'])

这有点像是一个hack,当进行高级数据库操作时可能会产生意外的结果(换句话说,在sqlite下测试可能会通过,但在mysql下会失败)。尽管如此,当你需要在生产服务器上使用mysql时,这是一个快速开始测试开发的好方法。 - Jeremy Blanchard

1

我一直遇到INNODB表创建速度缓慢的问题(大约需要25秒来创建13个小表)。

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

添加:

innodb_flush_method=fdatasync

生成最佳结果(大约1.5秒钟创建相同的13个小表)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接