SQL и MySQL
Любая выборка данных через ORM или старое API в итоге компилируется в SQL-запрос к MySQL, где каждое свойство инфоблока превращается в отдельный JOIN. Понимание структуры индексов, чтения планов через EXPLAIN и уровней изоляции транзакций необходимо для предотвращения деградации производительности и взаимных блокировок.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
SELECT, JOIN, GROUP BY, подзапросы
-
2
Индексы и EXPLAIN
-
3
Транзакции и уровни изоляции
-
4
Кодировки и коллации
Материалы
Официальная документация
Рекомендуем со стороны
-
SQL-EX: задачи по SQL Материал
Практика на реальных запросах
Проверь себя
Заказчик жалуется, что раздел каталога открывается шесть секунд, хотя код компонента стандартный. С чего начать?
С запроса, а не с PHP: включить SQL-статистику в панели «Отладка» или монитор производительности, взять самый долгий запрос и прогнать через EXPLAIN. Обычно там type: ALL по таблице свойств без индекса или лишние JOIN из фильтра по PROPERTY_*.
Почему фильтр по трём свойствам инфоблока в CIBlockElement::GetList() медленнее, чем фильтр по трём полям элемента?
Поля лежат в b_iblock_element, а значения свойств — в b_iblock_element_property или в отдельных таблицах b_iblock_element_prop_s{ID}. Каждое свойство в фильтре — отдельный JOIN, и без индексов MySQL перебирает таблицу значений целиком.
Что сломается, если списание остатка и создание заказа выполняются двумя отдельными запросами без транзакции?
При ошибке между ними остаток уже уменьшен, а заказа нет. Нужны startTransaction(), commitTransaction() и rollbackTransaction() соединения из Application::getConnection(), а уровень изоляции решает, увидит ли параллельный запрос промежуточное состояние.
В карточке товара вместо emoji знаки вопроса, хотя сайт в UTF-8. Где искать?
На уровне соединения и таблиц: charset соединения задаётся в connections в .settings.php, а поля должны быть в utf8mb4. Если база или поле в utf8 без mb4, четырёхбайтовые символы теряются при записи, и PHP тут не поможет.
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить