Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Оптимизация запроса Count() group by


Автор: sanich_ 20.11.2014, 22:34
Добрый день.
Прошу помощи:

Есть запрос:

Код

SELECT c.id_categ, c.categ, count(o.id) AS count_
  FROM categ c, rubrika r, object o where c.id_categ=r.id_categ and r.id_rubrika=o.id_rubrika
GROUP BY c.id_categ
order by c.order_


explain: http://SSMaker.ru/f4b97347/

Время выполнения: 1,716 с очень долго

Я его переписал в:

Код

select id_categ, categ, (select count(o.id) from object o,rubrika r where o.id_rubrika=r.id_rubrika and r.id_categ=c.id_categ) count_ from categ c order by c.order_


explain: http://SSMaker.ru/6641f194/

Время выполнения: 0,515 уже лучше, но всеравно долго

Дольше всего выполняется подсчет Count()

Как можно еще оптимизировать?

Автор: Akina 21.11.2014, 08:55
Где DDL? Где Explain цитатой с консоли?

Цитата(sanich_ @  20.11.2014,  23:34 Найти цитируемый пост)
Как можно еще оптимизировать? 

Создать необходимые для работы индексы. Вероятно, как минимум CREATE INDEX ON object (id_rubrika, id).

Автор: rodnover 24.11.2014, 05:34
Код

SELECT c.id_categ, c.categ, count(o.id) AS count_
  FROM categ c, rubrika r, object o where c.id_categ=r.id_categ and r.id_rubrika=o.id_rubrika
GROUP BY c.id_categ
order by c.order_


Во-первых, используйте group by НОРМАЛЬНО, то есть, в group by должны быть все поля, которые не задействованы в агрегатных функциях. Mysql единственная база данных, которую я встречал, которая позволяет так "вольготно" и неправильно группировать. Во-вторых проставить индексы, где необходимо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)