База База веб-разработчика Обязательно

SQL и MySQL

Любая выборка данных через ORM или старое API в итоге компилируется в SQL-запрос к MySQL, где каждое свойство инфоблока превращается в отдельный JOIN. Понимание структуры индексов, чтения планов через EXPLAIN и уровней изоляции транзакций необходимо для предотвращения деградации производительности и взаимных блокировок.

6 разработчиков прошли

Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.

Что нужно понимать

  • 1
    SELECT, JOIN, GROUP BY, подзапросы
  • 2
    Индексы и EXPLAIN
  • 3
    Транзакции и уровни изоляции
  • 4
    Кодировки и коллации

Материалы

Официальная документация

Рекомендуем со стороны

Проверь себя

Заказчик жалуется, что раздел каталога открывается шесть секунд, хотя код компонента стандартный. С чего начать?

С запроса, а не с 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: он знает документацию и материалы сайта по этой теме.

Знаете материал лучше?

Предложите ссылку: после проверки она появится в этом разделе.

Войти, чтобы предложить
Поделиться в Telegram
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти