Всем привет!
Буквально сегодня весь день занимался проблемой медленной работы с базой данных.
Немного вводной: есть корпоративный портал на битриксе. Живет он около 10 лет, соответственно мусора на нем накопилось очень-очень много. Таблица инфоблоков насчитывает около 500 тысяч элементов. И вот подошел момент, когда простые запросы к таблице инфоблоков (даже если писать их на чистом sql), результат которых должен быть под 100 записей длятся около 1-2 секунд, а если запрашивать пользовательские свойства, то и все 3-4. Примерный запрос:
SELECT
*
FROM b_iblock_element
WHERE
IBLOCK_ID = 3 AND ACTIVE = 'Y' AND
ACTIVE_TO >= '2019-08-14 00:00:00' AND
ACTIVE_FROM <= '2019-08-14 23:59:59'
ORDER BY `ACTIVE_FROM` ASC, `ACTIVE_TO` ASC LIMIT 0,100
Сервер стоит не слабый, на борту 64 Гб оперативной памяти, но вот настройки оказались далеки от совершенства. Процессами не сложного гугления, нашел оптимальные оптимальные настройки, которыми, с радостью, поделюсь:
[mysqld]
max_allowed_packet = 16M
key_buffer_size = 16M
innodb_buffer_pool_size = 16384M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 0
max_connections = 256
Всего 7 строчек конфига, и вместо 1-2 секунд получаем 0.2 - 0.4 секунды.
Конечно ещё далеко от совершенства, но уже гораздо приятнее. Далее предстоит большая чистка базы данных, что, надеюсь, должно принести свои плоды.
На сайте highload есть хорошая подборка конфигураций, для серверов с разным объемом памяти (ссылка)
Если у Вас есть, что добавить к данным настройкам, напишите в комментарии. Спасибо за внимание