Увеличить скорость создания таблиц MySQL в Django? - PullRequest
6 голосов
/ 08 января 2010

Некоторые из моих модульных тестов занимают 10-15 секунд только для mysql для создания таблиц Это кажется излишне долгим. Необходимо создать около 50 таблиц, но это все еще только 3 таблицы в секунду. Это очень неприятно, когда многократно запускаются юнит-тесты.

В качестве обходного пути я запускаю свои модульные тесты в sqlite3. Это невероятно быстро, но я бы предпочел запускать свои тесты на MySQL, поскольку именно на этом работают мои живые серверы.

Чтобы проиллюстрировать разницу в скорости, создайте новый проект. Затем запустите на нем syncdb, используя mysql. Затем попробуйте, используя 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 ]

3 голосов
/ 08 января 2010

Вы можете создать RAM-диск и переместить туда БД, только для модульного тестирования. Если вы пишете сценарий для этого, то это автоматически и очень удобно.

Также для других целей я написал специальный тестовый прогон, который загружает БД из дампа sql вместо создания, а затем создания таблиц.

Вы выбираете.

1 голос
/ 01 февраля 2012

Я обнаружил, что использование 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 голосов
/ 31 января 2012

Только на Mac OSX, добавьте в ваш ~ / .my.cnf следующее:

[mysqld]
skip-sync-frm=ON

Для меня это улучшило время запуска моего набора тестов Django на MySQL с 1 до 30 секунд!

Подробности здесь: http://www.stereoplex.com/blog/speeding-up-django-unit-test-runs-with-mysql

0 голосов
/ 11 ноября 2010

Я испытывал медленные скорости создания таблиц INNODB (около 25 секунд для создания 13 маленьких таблиц).

Я экспериментировал с параметрами в разделе [mysqld] файла my.cnf.

Добавление:

innodb_flush_method=fdatasync

дал лучшие результаты (около 1,5 секунд, чтобы создать те же 13 маленьких таблиц).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...