Налаштування базу даних MySQL/MariaDB для веб-додатку
MySQL й MariaDB залишаються широко розповсюджені вибір для веб-додатків—особливо в екосистемі PHP/Laravel, при міграції legacy-проектів й коли потрібна перевірена схема реплікації з читаною документацією.
Встановлення
MySQL 8.0 на Ubuntu:
apt install -y mysql-server
mysql_secure_installation
MariaDB 11.x (рекомендується для нових проектів—краща продуктивність, open source ліцензія):
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
apt install -y mariadb-server mariadb-client
Створення бази й користувача:
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
FLUSH PRIVILEGES;
utf8mb4 обов'язковий—справжній UTF-8 з підтримкою emoji. Старий MySQL utf8—трибайтний, що викликає проблеми з Unicode за межами BMP.
Конфігурація my.cnf
[mysqld]
# Основні налаштування (для 8 ГБ RAM)
innodb_buffer_pool_size = 5G # 60-70% RAM
innodb_buffer_pool_instances = 4 # по одній на 1-2 ГБ
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2 # компромісс надійність/швидкість
innodb_flush_method = O_DIRECT
# Підключення
max_connections = 200
thread_cache_size = 32
table_open_cache = 4000
# Запити
query_cache_type = 0 # query cache застарілий, вимкнути
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M
# Логування
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# Реплікація
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
Індекси й оптимізація запитів
-- Складені індекси—порядок має значення
-- Запит: WHERE user_id = ? AND status = ? ORDER BY created_at DESC
CREATE INDEX idx_orders_user_status_date
ON orders(user_id, status, created_at DESC);
-- Покриваючий індекс—відповідь з індексу без звернення до таблиці
CREATE INDEX idx_products_listing
ON products(category_id, is_active, price, id, name)
WHERE deleted_at IS NULL;
-- Перевірити використання індексу
EXPLAIN SELECT * FROM orders
WHERE user_id = 123 AND status = 'completed'
ORDER BY created_at DESC LIMIT 10;
Стратегія резервної копії
# Повна резервна копія
mysqldump -u root -p --all-databases --single-transaction > backup-$(date +%Y%m%d).sql
# Інкрементальна через binary logs
mysqlbinlog /var/log/mysql/mysql-bin.000001 | mysql -u root -p
# Автоматизована резервна копія на віддалену
0 2 * * * mysqldump -u myapp -pPassword myapp | gzip > /backups/myapp-$(date +\%Y\%m\%d).sql.gz
Настройка продуктивності
Моніторити повільні запити:
# Включити в my.cnf, потім аналізувати
mysqldumpslow /var/log/mysql/slow.log | head -20
Ключові метрики для спостереження:
-
Threads_connected—активні підключення -
Questions—запити за секунду -
Slow_queries—запити > long_query_time -
InnoDB_buffer_pool_pages_dirty—дані очікуючи скиду
Реплікація (Master-Slave)
Для HA налаштуйте реплікацію:
-- Master
CHANGE MASTER TO
MASTER_HOST='master-ip',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=155;
START SLAVE;
SHOW SLAVE STATUS\G
Таймлайн
Налаштування MySQL/MariaDB, створення користувача, базова оптимізація—2–3 години. Резервні копії, реплікація, моніторинг—4–6 годин. Проектування схеми, індекси, тестування—залежить від складності додатку.







