2010-01-08 16 views
6

我的一些單元測試需要10-15秒才爲mysql創建表。這似乎不必要的長。它必須創建大約50張桌子,但仍然只有每秒3張桌子。當重複運行單元測試時,這是一個很大的煩惱。提高在Django中創建MySQL表的速度?

作爲一種解決方法,我一直在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的表創建時間。

+0

您的MySQL表是本地還是遠程的? – Martin 2010-01-08 02:11:07

+0

它在我的Mac上是本地的。看看我的my.cnf如果你喜歡:http://pastebin.com/m69af8ba3 – Gattster 2010-01-08 02:13:13

+1

「我寧願在MySQL上運行我的測試」爲什麼?你不相信Django的ORM層? – 2010-01-08 02:15:09

回答

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

這是一種破解,在執行高級數據庫時可能會產生意想不到的結果(換句話說,當你的測試在mysql下失敗時,可能會在sqlite下傳遞)。這個sid,這是一個很好的解決方案,當你需要生產服務器的mysql時,可以快速開始測試開發。 – 2012-03-28 00:31:42

3

您可以創建RAM磁盤並在那裏移動數據庫,僅用於單元測試。 如果你爲此編寫腳本,那麼它是自動的,非常方便。

此外,爲了其他目的,我編寫了自定義測試運行器,它從sql轉儲裝載DB 而不是創建它,然後創建表。

您選擇。

+0

我從來沒有在內存盤上運行過mysql,但我認爲這很簡單,就像在另一個端口上設置一個新的mysql守護進程一樣簡單,並將其數據目錄指向內存磁盤。感謝您的提示。 – Gattster 2010-01-08 18:35:25

+0

是的,你也可以直接切換現有的mysql實例的配置(指向ram磁盤的db路徑),然後重新啓動它 - 兩者對你更好。 – 2010-01-08 18:57:50

+0

你真的在一個RAM磁盤上運行MySQL,並看到速度提高?它似乎會有所幫助,但直到你測試它,你真的不知道。 – Gattster 2010-01-08 20:38:14

0

我一直在經歷緩慢的INNODB表創建速度(大約25秒來創建13個小表)。

我在my.cnf文件的[mysqld]節中嘗試了一些選項。

添加:

innodb_flush_method=fdatasync 

產生最好的結果(約1.5秒來創建相同13個小的表)。