2010-01-08 11 views
6

Niektóre z moich testów jednostkowych zajmują 10-15 sekund tylko dla mysql do tworzenia tabel. Wydaje się to niepotrzebnie długie. Musi utworzyć około 50 tabel, ale to wciąż tylko 3 tabele na sekundę. Jest to wielka irytacja, gdy przeprowadzamy testy jednostkowe over-and-over.Zwiększenie szybkości tworzenia tabel MySQL w Django?

Jako obejście używam testów jednostkowych w sqlite3. Jest niesamowicie szybki, ale wolałbym uruchomić moje testy na MySQL, ponieważ to właśnie działają moje serwery live.

Aby zilustrować różnicę prędkości, utwórz nowy projekt. Następnie uruchom syncdb na nim używając mysql. Następnie spróbuj za pomocą 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 

Dla mnie tworzenie powyższych tabel w MySQL trwa około 2 sekund. Sqlite3 jest prawie natychmiastowy.

Używam mysql na mojej maszynie programistycznej. Oto mój my.cnf.

Proszę zasugerować wszelkie wskazówki lub poprawki, które mogą pomóc w przyspieszeniu czasu tworzenia tabel MySQL.

+0

Czy Twoja tabela MySQL jest lokalna czy zdalna? – Martin

+0

Jest lokalny na moim Macu. Sprawdź mój my.cnf, jeśli chcesz: http://pastebin.com/m69af8ba3 – Gattster

+1

"Wolałbym uruchomić moje testy na MySQL" Dlaczego? Nie ufasz warstwie ORM Django? –

Odpowiedz

1

I odkryli, że przy użyciu SQLite jako zamiennik sprawia, że ​​moje testy jednostkowe znacznie szybciej. Usuwam również southdb, ponieważ spowalnia to również tworzenie tabel.

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

To jest rodzaj hackowania i może powodować nieoczekiwane wyniki podczas wykonywania zaawansowanych operacji na bazie danych (innymi słowy, test może przejść pod sqlite, gdy zawiedzie się pod mysql). To sid, to jest dobre rozwiązanie, aby szybko rozpocząć testowanie, gdy potrzebujesz mysql do swojego serwera produkcyjnego. –

3

Można utworzyć dysk RAM i przenieść tam db, tylko do testów jednostkowych. Jeśli napiszesz scenariusz, będzie to automatyczne i bardzo wygodne.

Ponadto, dla innych celów napisałem niestandardowy biegacz testowy, który ładuje DB z sql dump zamiast tworzyć go, a następnie tworzyć tabele.

Wybierasz.

+0

Nigdy nie uruchamiałem mysql na dysku RAM, ale zakładam, że jest to tak proste, jak ustawienie nowego demona mysql na innym porcie i skierowanie jego katalogu danych do ramka dysk. Dzięki za wskazówki. – Gattster

+0

Tak, możesz także po prostu zmienić konfigurację (na tę, która ma ścieżkę db na dysk RAM) dla istniejącej instancji mysql, a następnie zrestartować ją - w zależności od tego, która opcja działa lepiej. –

+0

Czy faktycznie uruchomiłeś mysql na dysku RAM i zauważyłeś poprawę szybkości? Wygląda na to, że to pomogłoby, ale dopóki go nie przetestujesz, naprawdę nie wiesz. – Gattster

0

Występuje spowolnienie tworzenia tabel INNODB prędkości (około 25 sekund, aby utworzyć 13 małych tabel).

Eksperymentowałem z opcjami w sekcji [mysqld] pliku my.cnf.

dodania:

innodb_flush_method=fdatasync 

wytwarzane najlepsze wyniki (około 1.5 sekundy, aby tworzyć takie same 13 stoliki).