Настройка MySQL/MariaDB для 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка MySQL/MariaDB для 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка 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 без рестарта.