dlis 24.04.2011 23:03
Ubuntu — Ускоряем InnoDB в десятки раз (во время разработки/тестирования проекта)
Проблематика
При разработке проекта в локальной связке Mysql+PHP часто приходилось пересоздавать структуру базы данных (далее — БД). Под пересозданием я подразумеваю следующее:
- Удаление всех таблиц в БД (т.к. нормальной реализации удаления всех таблиц из БД да еще и с учетом зависимостей нету, удаление реализовано через пересоздание БД).
- Создание таблиц путем выполнения SQL-файла.
- Наполнение БД при помощи ORM в Kohana.
Во время тестирования проекта приходилось сохранять текущее состояние БД, производить тестирование, а затем откатывать до прежнего состояния. На все эти процессы терялось достаточно много времени. Например, указанная выше последовательность операций по пересозданию БД длилась приблизительно 50 секунд. Со временем это стало раздражать и я задался вопросом разогнать Mysql.
Цель
Ускорить работу Mysql во время разработки/тестирования проекта.
Поиски решения
Сразу оговорюсь, что все используемые мной таблицы имеют тип Innоdb.
Практически сразу на ум пришел вариант поместить всю Mysql в оперативную память. За помощью я отправился на просторы интернета.
Многочисленные варианты переноса было крайне трудно реализовать и работали они довольно криво. Руки постепенно опускались… и тут я наталкиваюсь на идеальный для себя вариант — размещение в оперативной памяти не Mysql целиком, а лишь данных, относящихся к типу Innodb. Другими словами, при таком подходе в оперативной памяти будут находится лишь созданные мной таблицы в формате Innodb, а системные таблицы останутся в памяти винчестера.
Реализация
Реализовано все в Ubuntu 10.10. Но, думаю, что и в других дистрибутивах должно работать.
- Создаем папку, в которой будем хранить все таблицы типа Innodb.
1
- Создаем в оперативной памяти раздел 100 Мб под наши таблицы и монтируем его в папку, созданную в предыдущем пункте. Для этого открываем таблицу монтирования разделов
1
1
- Подключаем указанный выше раздел, чтобы лишний раз не перезагружаться
1
- Остается лишь научить Mysql использовать нашу папку, физически расположенную в оперативной памяти. Для этого открываем конфиг Mysql
1
1
2
- И перезапустить Mysql
1
Имейте ввиду, что при перезагрузке компьютера, созданная нами папка будет очищаться. Следовательно, все таблицы, сохраненные в ней, будут удалены. В моем случае, в проекте реализован описанный выше механизм создания структуры БД, что решает данный вопрос.
Результат
Те операции, на которые требовалось около 50 секунд, сейчас выполняются уже за 2 секунды. Приятный душе скриншот:
Еще больше обрадовало то, что данный метод позволяет на стареньком нетбуке выполнять эту же операцию за эти же 2 секунды.
Дальнейшие пути развития
На просторах интернета я встречал варианты использования данного подхода не для разработки/тестирования проекта, а для полноценного использования. Для этого нужно периодически тем же rsync производить синхронизацию папки /var/lib/mysql/innodb с жестким диском, а при включении компьютера восстанавливать в оперативную память.
P.S.
Искренне надеюсь, что данное решение поможет кому-нибудь сэкономить его драгоценное время во время разработки/тестирования проекта, использующего БД Mysql.
nvbn 25.04.2011 11:26 #
+ 1 -
Рискованно)
Было бы рискованно, если бы предлагалось использовать данный метод в работе, а не на стадии разработки/тестирования.
На всякий случай дополнил заголовок поста и добавил формулировку цели, чтобы не исключить введение в заблуждение.