dlis 24.04.2011 23:03

UbuntuУскоряем InnoDB в десятки раз (во время разработки/тестирования проекта)

Проблематика


При разработке проекта в локальной связке Mysql+PHP часто приходилось пересоздавать структуру базы данных (далее — БД). Под пересозданием я подразумеваю следующее:

  1. Удаление всех таблиц в БД (т.к. нормальной реализации удаления всех таблиц из БД да еще и с учетом зависимостей нету, удаление реализовано через пересоздание БД).

  2. Создание таблиц путем выполнения SQL-файла.

  3. Наполнение БД при помощи ORM в Kohana.


Во время тестирования проекта приходилось сохранять текущее состояние БД, производить тестирование, а затем откатывать до прежнего состояния. На все эти процессы терялось достаточно много времени. Например, указанная выше последовательность операций по пересозданию БД длилась приблизительно 50 секунд. Со временем это стало раздражать и я задался вопросом разогнать Mysql.

Цель


Ускорить работу Mysql во время разработки/тестирования проекта.

Поиски решения


Сразу оговорюсь, что все используемые мной таблицы имеют тип Innоdb.

Практически сразу на ум пришел вариант поместить всю Mysql в оперативную память. За помощью я отправился на просторы интернета.

Многочисленные варианты переноса было крайне трудно реализовать и работали они довольно криво. Руки постепенно опускались… и тут я наталкиваюсь на идеальный для себя вариант — размещение в оперативной памяти не Mysql целиком, а лишь данных, относящихся к типу Innodb. Другими словами, при таком подходе в оперативной памяти будут находится лишь созданные мной таблицы в формате Innodb, а системные таблицы останутся в памяти винчестера.

Реализация


Реализовано все в Ubuntu 10.10. Но, думаю, что и в других дистрибутивах должно работать.

  1. Создаем папку, в которой будем хранить все таблицы типа Innodb.
    1
    sudo mkdir /var/lib/mysql/innodb


  2. Создаем в оперативной памяти раздел 100 Мб под наши таблицы и монтируем его в папку, созданную в предыдущем пункте. Для этого открываем таблицу монтирования разделов
    1
    sudoedit /etc/fstab

    и добавляем в нее строку
    1
    tmpfs /var/lib/mysql/innodb tmpfs size=100M 0 0


  3. Подключаем указанный выше раздел, чтобы лишний раз не перезагружаться
    1
    sudo mount -a


  4. Остается лишь научить Mysql использовать нашу папку, физически расположенную в оперативной памяти. Для этого открываем конфиг Mysql
    1
    sudoedit /etc/mysql/my.cnf

    и добавляем в раздел "Innodb" следующие строки
    1
    2
    innodb_data_home_dir=/var/lib/mysql/innodb
    innodb_log_group_home_dir=/var/lib/mysql/innodb


  5. И перезапустить Mysql
    1
    sudo service mysql restart



Имейте ввиду, что при перезагрузке компьютера, созданная нами папка будет очищаться. Следовательно, все таблицы, сохраненные в ней, будут удалены. В моем случае, в проекте реализован описанный выше механизм создания структуры БД, что решает данный вопрос.

Результат


Те операции, на которые требовалось около 50 секунд, сейчас выполняются уже за 2 секунды. Приятный душе скриншот:



Еще больше обрадовало то, что данный метод позволяет на стареньком нетбуке выполнять эту же операцию за эти же 2 секунды.

Дальнейшие пути развития


На просторах интернета я встречал варианты использования данного подхода не для разработки/тестирования проекта, а для полноценного использования. Для этого нужно периодически тем же rsync производить синхронизацию папки /var/lib/mysql/innodb с жестким диском, а при включении компьютера восстанавливать в оперативную память.

P.S.


Искренне надеюсь, что данное решение поможет кому-нибудь сэкономить его драгоценное время во время разработки/тестирования проекта, использующего БД Mysql.


Тэги: innodb mysql php server ubuntu
+ 4 -
Похожие Поделиться

nvbn 25.04.2011 11:26 #
Рискованно)
dlis 25.04.2011 12:57 #
Было бы рискованно, если бы предлагалось использовать данный метод в работе, а не на стадии разработки/тестирования.
xT 25.04.2011 11:31 #
блин, думал сам иннодб какой-то магией ускоряют, аля патч "200 строк"
shisoid 25.04.2011 12:36 #
"200 строк" - кривая поделка
не нужно нам такой магии
dlis 25.04.2011 13:26 #
На всякий случай дополнил заголовок поста и добавил формулировку цели, чтобы не исключить введение в заблуждение.
pozadi 25.04.2011 19:51 #
3 пункт можно заменить на
1
sudo mount -a
это примонтирует всё что есть в /etc/fstab
dlis 25.04.2011 21:46 #
Спасибо большое. Сейчас исправлю.