Столкнулся с проблемой очень долго удаления элементов инфоблока (2-4 секунды).
Есть 2 инфоблока:- Товары, нём примерно 150.000 позиций (IBLOCK_ID = 3)
- Фотографии, в нём примерно 80.000 позиций и каждая имеет множественную привязку к товарам (IBLOCK_ID = 7)
Речь идёт про витрину товаров на редакции Стандарт.
Товары часто добавляются и удаляются, и удаление одного товара занимало 2-4 секунды, для удаления 100 товаров уже требовалось несколько минут.
Посмотрел slow_query log в mysql, обнаружил что очень долго выполняется запрос такого плана:
DELETE FROM b_iblock_element_prop_m7 WH ERE IBLOCK_PROPERTY_ID IN (17) AND VALUE_NUM=1559484; |
Проблема была в удалении привязанных фоток. При удалении из инфоблока с товарами #3, проверяются все связи и в частности в инфоблоке с фотками #7.
Посмотрел таблицу свойств для инфоблока с фотками #7 b_iblock_element_prop_m7 и увидел, что нет индекса по полям IBLOCK_PROPERTY_ID+VALUE_NUM.
Добавление индекса дало прирост с 2-4 секунд до 0.00008. Фактически удаление стало мгновенным.
В таблицах свойств для товаров содержится 705 000 записей = 170 мб
В таблице свойств для содержится 780 000 записей = 510 мб
Отмечу, что проверка системы проходила без ошибок, т.е. индексов по этим полям в продукте на текущий момент не предусмотрено.
- железо: VDS на SSD у FirstVDS, 6 Гб память и 6 ядер процессор
- софт: bitrix_env, mysql percona 5.7.21, php 7.2.31, битрикс 20.0.650