Подскажите, какой вариант триггера оптимальнее или как протестировать это дело в 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(*) FROM
productsWHERE active=1 and category_id=1
Для одного индекса и для пяти индексов результат одинаков, в итоге время снизилось с 400 до 200мс.
Тоже не густо... Что еще предпринять-то?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите пожалуйста, как предотвратить временного зависания скрипта во время работы циклаНасколько я знаю, нельзя параллельно работать...
Как реализовать плавное выдвижение блока с помощью Jquery? Но нужно не просто скрыть/показать, а изначально должна быть видна верхняя часть...