Какой вариант триггера оптимальнее для выборки товаров с пагинацией и по категориям

78
28 ноября 2021, 02:30

Подскажите, какой вариант триггера оптимальнее или как протестировать это дело в phpMyAdmin?
Предыстория - БД InnoDB, в таблице products 2'000'000 строк, для отображения с сортировкой и пагинацией по 24 товара из текущей категории запускается следующий алгоритм:
1. первый запрос подсчитывает кол-во товаров в текущей категории, стандартным COUNT(*) с добавлением WHERE "текущая категория" по всей таблице products, запрос нужен для формирования ссылок пагинации
2. второй запрос получает набор ID товаров, согласно условиям сортировки
3. третий запрос получает полные данные по этим 24 товарам через IN

1-й запрос самый тяжелый, хоть и самый простой - 400мс - поэтому решил получать кол-во товаров для текущей категории не запросом в огромную таблицу с 2'000'000 товаров,а в новую таблицу, где для каждой категории будет хранится одна строка с числом, а записывать-обновлять в эту таблицу триггером.
Вот и вопрос - обновлять число товаров оптимальнее через counts=counts+1 или же запускать подсчет при каждом добавлении нового товара через пробежку по всей таблице товаров через COUNT(*) ? Вроде бы первый вариант более скоростной, но что, если добавлять товары будет несколько пользователей, например, этих пользователей около 10'000 ? БД будет формировать очередь или наступит хаос? А что если импортировать сразу пачку товаров, например, 20'000 товаров за раз, как тут будет вести себя БД?
Фух,ну и простыня,сорри)))

Вот этот запрос-тормоз

UPD. Как подсказали два уважаемых человека, спасибо им, нужен индекс на участвующие в запросе поля. Запрос: EXPLAIN SELECT SQL_NO_CACHE COUNT(*) FROMproductsWHERE active=1 and category_id=1
Для одного индекса и для пяти индексов результат одинаков, в итоге время снизилось с 400 до 200мс.

Тоже не густо... Что еще предпринять-то?

READ ALSO
JS добавление класса в цикле

JS добавление класса в цикле

Есть такая проблемаНа странице расположено несколько элементов

220
Асинхронность js (подвисание скрипта)

Асинхронность js (подвисание скрипта)

Подскажите пожалуйста, как предотвратить временного зависания скрипта во время работы циклаНасколько я знаю, нельзя параллельно работать...

198
Как показать блок полностью при первом клике и раскрыть его на весь экран при повторном?

Как показать блок полностью при первом клике и раскрыть его на весь экран при повторном?

Как реализовать плавное выдвижение блока с помощью Jquery? Но нужно не просто скрыть/показать, а изначально должна быть видна верхняя часть...

310