Знатоки SQL! Нужна помощь в оптимизации то ли запроса, то ли базы данных.В двух словах, есть база данных некоторых товаров, у каждого товара есть производитель (id) и кол-во таких товаров в наличии. Необходимо выдать общее количество разных товаров каждого производителя. Это, конечно практически книжный пример использования GROUP BY, но задача усложняятся тем, что записей в таблице миллионы и работает стандартное решение слишком медленно. Может, кто-нибудь знает какой-то хитрый вариант решения данной проблемы?
Заранее всем спасибо!
Кроме group by id с вытаскиванием sum(count) ничего вроде и не сделать. Насколько медленно? Какая БД? Если есть возможность можно снапшот (Materialized View) оcвежать по расписанию. Динамика то у таблицы наверное небольшая в пределах допустимых погрешностей.
>Кроме group by id с вытаскиванием sum(count) ничего вроде и не сделать.
>Насколько медленно? Какая БД? Если есть возможность можно снапшот (Materialized View)
>оcвежать по расписанию. Динамика то у таблицы наверное небольшая в пределах
>допустимых погрешностей.Т.е. сделать какой-то кеш? Беда в том, что запрос с дополнительными условиями вроде категории товара и т.п. и от этого зависит кол-во. Все варианты не выйдет покешировать.
А работает это все достаточно медленно, чтобы быть слишком медленным для юзера. База данных -- MySQL
какой движок табличный (иннодб?)..
и как организована таблица и индексы в ней?возможно создание дополнительных(и м/б избыточных) индексов по нескольким полям улучшит ситуацию...
>Необходимо выдать общее
>количество разных товаров каждого производителя.Это понимается достаточно конкретно, и может быть кэшировано. Если Вам нужно что-то ещё, описывайте подробнее.
Сталкнулся с похожей проблемойДобавлены строки: 21057 (запрос занял 108.9304 сек.)
SQL-запрос:
INSERT IGNORE INTO temp2
SELECT page_graph.id_page_to
FROM page_graph
RIGHT JOIN temp1 ON ( temp1.id = page_graph.id_page_from ) ;---------------------------------------
А SELECT:
строки 0 - 29 (4,629,563 всего, запрос занял 0.0004 сек.)
SQL-запрос:
SELECT page_graph.id_page_to
FROM page_graph
RIGHT JOIN temp1 ON ( temp1.id = page_graph.id_page_from ) ;
Сталкнулся с похожей проблемойДобавлены строки: 21057 (запрос занял 108.9304 сек.)
SQL-запрос:
INSERT IGNORE INTO temp2
SELECT page_graph.id_page_to
FROM page_graph
RIGHT JOIN temp1 ON ( temp1.id = page_graph.id_page_from )---------------------------------------
А SELECT:
строки 0 - 29 (4,629,563 всего, запрос занял 0.0004 сек.)
SQL-запрос:
SELECT page_graph.id_page_to
FROM page_graph
RIGHT JOIN temp1 ON ( temp1.id = page_graph.id_page_from )