2010-01-08 11 views
6

Algunas de las pruebas de mi unidad tardan 10-15 segundos solo para que mysql cree las tablas. Esto parece innecesariamente largo. Tiene que crear alrededor de 50 tablas, pero eso sigue siendo solo 3 tablas por segundo. Esto es una gran molestia cuando se ejecutan pruebas unitarias una y otra vez.¿Aumenta la velocidad para la creación de tablas MySQL en Django?

Como solución temporal, he estado ejecutando mis pruebas unitarias en sqlite3. Es increíblemente rápido, pero preferiría ejecutar mis pruebas en MySQL ya que eso es lo que ejecutan mis servidores en vivo.

Para ilustrar la diferencia de velocidad, cree un proyecto nuevo. Luego ejecuta syncdb en él usando mysql. Entonces pruébalo usando 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 

Para mí, se tardan unos 2 segundos en crear las tablas anteriores en MySQL. Sqlite3 es casi instantáneo.

Estoy ejecutando mysql en mi máquina de desarrollo. Aquí está mi my.cnf.

Por favor, sugiera cualquier sugerencia o modificación que pueda pensar que pueda ayudar a acelerar el tiempo de creación de la tabla de MySQL.

+0

¿Su tabla MySQL es local o remota? – Martin

+0

Es local en mi mac. Consulte my.cnf si lo desea: http://pastebin.com/m69af8ba3 – Gattster

+1

"Preferiría ejecutar mis pruebas en MySQL" ¿Por qué? ¿No confías en la capa Django ORM? –

Respuesta

1

he encontrado que el uso de SQLite como reemplazo hace que mis pruebas de unidad mucho más rápido. También estoy eliminando southdb, ya que esto ralentiza la creación de tablas también.

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

Esto es como un truco, y puede producir resultados inesperados al hacer cosas avanzadas de la base de datos (en otras palabras, su prueba puede pasar bajo sqlite cuando fallaría en mysql). Eso sí, esta es una buena solución para comenzar el desarrollo de pruebas rápidamente cuando necesite mysql para su servidor de producción. –

3

Puede crear discos RAM y mover db allí, solo para pruebas de unidades. Si escribe un script para esto, entonces es automático y muy conveniente.

Además, para otros fines he escrito runner de prueba personalizado que carga DB de sql dump en lugar de crearlo y crear tablas.

Tú eliges.

+0

Nunca he ejecutado mysql en un disco RAM, pero supongo que es tan simple como configurar un nuevo daemon mysql en un puerto diferente, y apuntando su directorio de datos a un ram disco. Gracias por los consejos. – Gattster

+0

Sí, también podría simplemente cambiar la configuración (a la que tiene la ruta db apuntando al disco RAM) para su instancia mysql existente y luego reiniciarla, lo que funcione mejor para usted. –

+0

¿Ha ejecutado mysql en un disco RAM y ha visto una mejora en la velocidad? Parece que ayudaría pero hasta que lo pruebes realmente no lo sabes. – Gattster

0

He estado experimentando velocidades lentas de creación de tablas INNODB (aproximadamente 25 segundos para crear 13 tablas pequeñas).

Experimenté con opciones en la sección [mysqld] del archivo my.cnf.

Adición:

innodb_flush_method=fdatasync 

produjo los mejores resultados (alrededor de 1,5 segundos para crear el mismo 13 mesas pequeñas).

Cuestiones relacionadas