Прискорюємо mysql insert

Трохи теорії. В операційних системах UNIX існує розділ файлової системи, який фізично перебуває в оперативній пам'яті, але дозволяє працювати з ним як зі звичайним дисковим накопичувачем. Швидкість доступу до блоку жорсткого диска приблизно дорівнює 1 мс. Швидкість доступу до пам'яті - 0.001 мс. Спробуємо застосувати це до БД MySQL, щоб вичавити максимум з операцій insert / update.

Спершу перевіримо швидкість випадкового запису на жорсткий диск:

Тепер те ж саме для shared memory (/ run / shm або / dev / shm):

Порівняємо результати і побачимо, що час створення 1000 файлів зменшилася в 574 рази. Добре. Значить, слід очікувати приріст швидкості запису в БД.

1) Перевіряємо розмір і вільне місце для / run / shm

2) Перевіряємо скільки місця займає БД

Значить, що базу ми можемо перенести в / run / shm

3) Зупиняємо MySQL:

4) Створюємо директорії і копіюємо дані:

5) Правимо конфиг:

6) Правимо AppArmor:

7) Запускаємо MySQL

* Якщо сервіс не стартує - дивимося /var/log/mysql/error.log

Тепер найцікавіше. Перевіряємо, що вийшло.

Тест на жорсткому диску я провів заздалегідь, тому відразу привожу результати.

Update виконувався за випадковим інтервалу [1 000 000 - 9 000 000] для первинного ключа (id). Крайні значення відкинуті, щоб движок «копався» всередині таблиці.

Істотний приріст швидкості на INSERT і ще більший на UPDATE.
Менше для вставки, тому що MySQL виробляє перерахунок індексів і організацію даних.

В налаштуваннях MySQL виставлено:
innodb_buffer_pool_size = 1024M
Якщо ставити менше, то швидкість UPDATE для HDD природно падає.

innodb_flush_log_at_trx_commit = 2
Як таких транзакцій тут у нас немає і на швидкість це не впливає. Проте, залишаємо це значення рівним 2.

При такій схемі критично важливо писати бінарний лог і регулярно робити бекап. Максимально знизити витрати записи ми можемо тільки вказавши для бінарники окремий жорсткий диск. Послідовна швидкість запису на вінчестер набагато вище випадковою. Тому ставимо в систему додатковий жорсткий диск, монтуємо його, наприклад, в / mnt / hddbin /, і вказуємо в my.ini шлях для бінарного логу: log_bin = /mnt/hddbin/mysql-bin.log

Не забуваємо додати скрипти для перезавантаження та зупинки системи. Дивимося папку / etc / rc *. Зазвичай це 0 (відключення системи) і 6 (перезавантаження). Мануал, як додати скрипти легко знайти в гуглі. Скрипт перед перезавантаженням або вимиканням системи зупиняє MySQL, потім копіює папку / run / shm / mysql-lib на жорсткий диск. При включенні системи скрипт відновлює дані з жорсткого диска в папку / run / shm / mysql-lib і після запускає MySQL.

Так само додаємо простенький bash або perl скрипт для моніторингу вільної пам'яті в / run / shm. Можна підключити Zabbix.

Схожі статті