Настройка MySQL/MariaDB для 1С-Битрикс
Настройка MySQL/MariaDB для 1С-Битрикс
«Сервер с 32 ГБ RAM, но MySQL использует только 2 ГБ» — типичная ситуация на установке Битрикс с дефолтными настройками. 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–5x рост записи.
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
Таблицы Битрикс: специфика
b_search_content — полнотекстовый индекс. Таблица растёт до 2–5 ГБ на крупных сайтах. Если используется Elasticsearch — эту таблицу можно усечь и отключить встроенную индексацию.
b_iblock_element_prop_m* — множественные свойства. При 1М+ строк без индексов — тормоз умного фильтра.
b_event — лог событий системы. На активных сайтах растёт на 10–50 МБ в сутки. Чистить через агент или крон:
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 без рестарта.







