Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: соптимизировать селект  (Прочитано 9191 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 06-07-2007 20:06 » 

База данных MySQL

На приведенный ниже селект приходиться львиная доля нагрузки

Возможно ли как-нибудь его оптимизировать? Например, избавиться от внутреннего селекта?

Код:
SELECT posts.pub_date, COUNT(1) AS goods_count, bads.bads_count
FROM posts
INNER JOIN deals ON deals.post_id = posts.id
INNER JOIN
(
SELECT posts.id AS bad_id, COUNT(1) AS bads_count FROM posts INNER JOIN deals ON deals.post_id = posts.id
WHERE deals.is_good = FALSE AND posts.pub_date BETWEEN '2007-01-01' AND '2008-01-01'
GROUP BY posts.pub_date
ORDER BY posts.pub_date ASC
)
AS bads ON bads.bad_id = posts.id
WHERE deals.is_good = TRUE AND posts.pub_date BETWEEN '2007-01-01' AND '2008-01-01'
GROUP BY posts.pub_date
ORDER BY posts.pub_date ASC
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 06-07-2007 21:18 » 

ты расскажи хоть зачем тебе его упрощать? что сам пытался сделать?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 06-07-2007 22:18 » 

сам пытался, но вложенный селект все равно остается...

нужно упростить для увеличения скорости выполнения
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 06-07-2007 22:34 » 

Mfcer__, Я думаю, McZim не это имел ввиду в своем вопросе. Опиши примерную структуру учавствуюших таблиц, и что ты хочеш с них получить.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 07-07-2007 06:22 » 

Mfcer__, Я тут посидел чуток с твоим запросом, думаю он у тебя вообше не должен работать.

Вот моя версия запроса:
Код:
select 
   pub_date as Date,
   case when good.count is NULL then 0 else good.count end as good,
   case when bad.count is NULL then 0 else bad.count end  as bad
from
posts left join
(SELECT
   posts.pub_date AS date,
   count(1) as count
FROM posts,deals
WHERE
   deals.post_id = posts.id and
   deals.is_good = false 
group By posts.pub_date) as bad
on pub_date=bad.date left join
(SELECT
   posts.pub_date AS date,
   count(1) as count
FROM posts,deals
WHERE
   deals.post_id = posts.id and
   deals.is_good = true
group By posts.pub_date) as good
on pub_date=good.date
where
   pub_date BETWEEN '2007-01-01' AND '2008-01-01'
group by pub_date
order by pub_date asc
запрос состоит из 3 селектов. На pub_date не мешало бы поставить индекс для ускорения работы. А вообше по идее говоря, лучше было бы сделать два запроса:
Код:
SELECT 
   posts.pub_date AS date,
   count(1) as count
FROM posts,deals
WHERE
   deals.post_id = posts.id and
   deals.is_good = true AND
   posts.pub_date BETWEEN '2007-01-01' AND '2008-01-01'
group By posts.pub_date
Один с true и второй с false и затем их аппликативно склеивать.
« Последнее редактирование: 07-07-2007 06:32 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 07-07-2007 09:30 » new

Во нашел более легкое решение Улыбаюсь
Код:
select
   pub_date as Date,
   sum(case when is_good=true then 1 else 0 end ) as Good,
   sum(case when is_good=false then 1 else 0 end) as Bad
from
   posts, deals
where
   posts.id=post_id and
   pub_date between '2007-01-01' and '2008-01-01'
group by pub_date
order by pub_date asc;
« Последнее редактирование: 07-07-2007 09:34 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #6 : 07-07-2007 09:59 » 

СПАСИБО! то что нужно
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines