Налаштування MySQL/MariaDB для 1С-Бітрікс
Налаштування MySQL/MariaDB для 1С-Бітрікс
«Сервер з 32 ГБ RAM, але MySQL використовує лише 2 ГБ» — типова ситуація на установці 1С-Бітрікс зі стандартними налаштуваннями. innodb_buffer_pool_size за замовчуванням 128 МБ або 8 МБ залежно від дистрибутива. На каталозі з 500 000 SKU робочий набір даних — 4–8 ГБ. Без нормального buffer pool кожен запит до незакешованих сторінок іде на диск: 5–10 мс замість 0,1 мс з пам'яті.
Ключові параметри InnoDB
Файл /etc/mysql/conf.d/bitrix.cnf:
[mysqld]
# ===== InnoDB Buffer Pool =====
# 60-70% від RAM для виділеного DB-сервера
innodb_buffer_pool_size = 20G
innodb_buffer_pool_instances = 8 # ~1 instance per 1-2GB
# ===== InnoDB I/O =====
innodb_io_capacity = 2000 # для SSD: 2000-4000
innodb_io_capacity_max = 4000
innodb_flush_method = O_DIRECT # обхід OS page cache
innodb_flush_log_at_trx_commit = 2 # без fsync на кожну транзакцію
# ===== Redo Log =====
# MySQL 8.0+: керується автоматично
# MariaDB / MySQL 5.7:
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
# ===== Connections =====
max_connections = 500
thread_cache_size = 50
wait_timeout = 300
interactive_timeout = 300
# ===== Query Cache =====
# MySQL 8.0: Query Cache видалено
# MariaDB / MySQL 5.7: вимикаємо (краще використовувати Memcached/Redis)
query_cache_type = 0
query_cache_size = 0
# ===== Temp Tables =====
tmp_table_size = 256M
max_heap_table_size = 256M
# ===== Slow Log =====
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
innodb_flush_log_at_trx_commit = 2 — транзакційний лог скидається на диск раз на секунду, а не при кожному COMMIT. Ризик втрати транзакцій за 1 секунду при збої — прийнятний для більшості інтернет-магазинів. Дає зростання запису в 3–5 разів.
innodb_flush_method = O_DIRECT — MySQL пише напряму до блокового пристрою, минаючи OS page cache. Усуває подвійне кешування (InnoDB buffer pool + OS cache).
Налаштування для NVMe SSD
На сучасних NVMe дисках можна бути агресивнішими:
innodb_io_capacity = 10000
innodb_io_capacity_max = 20000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
Таблиці 1С-Бітрікс: специфіка
b_search_content — повнотекстовий індекс. Таблиця зростає до 2–5 ГБ на великих сайтах. Якщо використовується Elasticsearch — цю таблицю можна усікти і вимкнути вбудовану індексацію.
b_iblock_element_prop_m* — множинні властивості. При 1М+ рядків без індексів — гальмо розумного фільтра.
b_event — лог подій системи. На активних сайтах зростає на 10–50 МБ на добу. Очищати через агент або cron:
DELETE FROM b_event WHERE DATE_COLUMN < DATE_SUB(NOW(), INTERVAL 90 DAY);
Моніторинг стану InnoDB
-- Ефективність buffer pool (має бути > 99%)
SELECT
(1 - (
(SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads')
/
(SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests')
)) * 100 AS buffer_pool_hit_rate;
-- Топ очікувань
SELECT * FROM sys.innodb_lock_waits;
buffer_pool_hit_rate < 95% — innodb_buffer_pool_size занадто малий, дані постійно зчитуються з диска.
Терміни
Аудит поточної конфігурації, налаштування параметрів, перевірка через slow log — 4–8 годин. Застосування потребує рестарту MySQL (5–10 секунд простою) або виконання частини параметрів через SET GLOBAL без рестарту.







