Оптимізація SQL-запитів через EXPLAIN-аналіз 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Оптимізація SQL-запитів через EXPLAIN-аналіз 1С-Бітрікс
Проста
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Оптимізація SQL-запитів через EXPLAIN-аналіз 1С-Бітрікс

EXPLAIN — команда MySQL, яка показує план виконання запиту: які таблиці сканюються, використовуються ліндекси, скільки рядків обробляється. Це основний інструмент після виявлення повільного запиту в slow query log.

Як читати EXPLAIN

EXPLAIN SELECT * FROM b_iblock_element
WHERE IBLOCK_ID = 5 AND ACTIVE = 'Y'
ORDER BY SORT;

Ключові стовпці виводу:

Стовпець На що дивитися
type ALL = повне сканування (погано), ref/range/const = використовує індекс
key Який індекс вибрав оптимізатор, NULL = індексу немає
rows Оцінка числа рядків для перегляду. 100 000+ при простому виборі — проблема
Extra Using filesort = сортування в пам'яті/на диску. Using temporary = тимчасова таблиця

EXPLAIN ANALYZE (MySQL 8.0+, MariaDB 10.9+) виконує запит і показує реальний час:

EXPLAIN ANALYZE SELECT ...;

Характерні проблеми Бітрікс

Using filesort на b_iblock_element. Запит сортує за SORT, але індекс не охоплює комбінацію (IBLOCK_ID, ACTIVE, SORT). Рішення: складений індекс:

ALTER TABLE b_iblock_element
ADD INDEX ix_iblock_active_sort (IBLOCK_ID, ACTIVE, SORT);

rows = 500 000 на запит до b_iblock_element_property. Фільтрація за значенням властивості без індексу за (IBLOCK_PROPERTY_ID, VALUE). Для VARCHAR-поля VALUE — індекс за префіксом VALUE(64).

Using temporary при GROUP BY. Трапляється у запитах фасетного фільтра. Фасет Бітрікс будує оптимізовані таблиці b_iblock_find_* — якщо вони не перестворені після додавання властивостей, запити йдуть в обхід.

Порядок роботи

  1. Отримати повільний запит з slow query log або SQL-трекера Бітрікс
  2. Запустити EXPLAIN — знайти type=ALL або rows > 10 000 при точковому виборі
  3. Визначити відсутній індекс або неефективний JOIN
  4. Додати індекс, повторити EXPLAIN — переконатися, що type змінився
  5. Перевірити реальний час на боєвих даних

Після додавання індексу MySQL не завжди його вибере — якщо статистика таблиці застаріла, запустіть ANALYZE TABLE b_iblock_element для перерахунку.