Раздел: MySQL
Темы:
Дата создания: 2025-06-19 18:36:07
| Файл | Было | Стало |
|---|---|---|
| blocks/leftMenu.php | 6-fold LEFT JOIN + три условия IS NOT NULL | Один запрос с EXISTS (…) |
| главный файл (каталог на главной) | Те же 6 LEFT JOIN-ов | Тот же приём — EXISTS (…) |
| goods2model | Без индекса | Индекс g2m_model_uid (model_id, goods_uid) |
Индексы.
Индекс — упорядоченный указатель.
С ним MySQL ищет нужный model_id мгновенно, вместо просмотра 100 000 строк.
EXISTS вместо «крестовых» JOIN’ов.
Старый вариант: каждая категория соединялась с goods, потом с goods2model, затем с rims, wheel … и т. д.
Новый вариант: MySQL лишь проверяет факт существования хотя бы одного товара, подходящего выбранной модели.
Запрос читает десятки строк, а не тысячи.
Меньше колонок — меньше группировки.
Мы убрали лишние поля (g.uid, r.uid, w.uid) из выборки — серверу не приходится группировать большие наборы данных.
| Этап | До | После |
|---|---|---|
| Время SQL-запроса меню (без индекса) | 150–400 мс | 5–15 мс |
| Серверная генерация HTML | 300–600 мс | 40–80 мс |
| «TTFB» страницы после выбора модели | 0,8–1,5 с | 0,15–0,3 с |
| Визуальная загрузка каталога | «долго крутится» (1–3 с) | почти мгновенно (< 0,5 с) |
Создали индекс
Переписали запрос в leftMenu.php
Переписали аналогичный запрос в главном файле
(тот же шаблон EXISTS).
Код вывода плиток/ссылок оставили прежним — логика сайта не изменилась.
Lazy-load картинок (loading="lazy") ещё сильнее сократит время «рисования» каталога.
При желании можно кешировать готовый HTML меню на 1–2 минуты (в $_SESSION или OPCache) — это разгрузит БД при пиковых посещениях.
Результат: выбор модели теперь не ощущается «тормозом»: модалка закрылась → меню и товары появляются почти сразу, а сервер остаётся прохладным и довольным.