Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как лучше реализовать информацию о количестве 
:(
    Опции темы
sanich_
Дата 5.3.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



У меня такая проблема:

Есть рубрики, есть объявления принадлежащие рубрикам.
т.е. 2 таблицы

Нужно оперативно получать информацию о количестве обяъвлений в каждой рубрике.

Сначала решил что поле (COUNT_) в таблице рубрик (для хранения информации о количестве) нет необходимости хранить, лучше запросом вычислять,- это избавляет от необходимости пересчитывать каждый раз объявления (при добавлении/удалении)

Запросик простой


Код

select r.id_rubrika id, r.rubrika,c.order_, r.order_,(select count(1) from object where blok<>2 and id_rubrika=r.id_rubrika) as count_ from rubrika r ,categ c
where r.id_categ=c.id_categ 



План запроса чуть ниже

Сначала летал - 0,001s, когда объявлений было мало - порядка 100 записей, и рубрик было где то 32.

Сейчас рубрик 258, объявлений 4000, запрос выполняется долго 0,10s и я подозреваю что это время будет расти с количесвом объявлений.

Как же лучше все таки сделать, хранить отдельное поле о количестве? Или что то с запросом не так? Как в этом форуме вычислается количество тем в каждой ветке?



Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Untitled_1___________.jpg 30,06 Kb
PM MAIL   Вверх
solenko
Дата 5.3.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



sanich_, обычно join быстрее вложенных запросов
Код

SELECT r.id_rubrika id, r.rubrika,c.order_, r.order_, count(o.id_rubrika) as posts_count
FROM rubrika r INNER JOIM categ c ON r.id_categ=c.id_categ 
   INNER JOIN object o ON o.id_rubrika=r.id_rubrika
WHERE o.block <> 2
GROUP BY  r.id_rubrika 
 
Хотя я бы хранил количество для каждой. Операция всставки/удаления объявлений выполняются намного легче и запросы намного 
Код

UPDATE rubrika SET count_ = count+1;

Выполнить не сложно.

Насколько я знаю, в высоко нагруженных системах, такой сбор статистики делается переодически -- запуск по крону скрипта, который подсчитывает количество и обновляет поле count_

Это сообщение отредактировал(а) solenko - 5.3.2008, 14:07


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
sanich_
Дата 5.3.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



не знаю как join работает быстре (возможно дело в группировке)

ваш запрос

Код
(не много модифицировал т.к. не показывались рубрики у которых небыло объявлений)
select r.id_rubrika id, r.rubrika,c.order_, r.order_,count(o.id)
from categ c,rubrika r left join object o on r.id_rubrika=o.id_rubrika and o.blok<>2
where r.id_categ=c.id_categ
group by  r.id_rubrika

Результат 0,359s

мой запрос
Код

select r.id_rubrika id, r.rubrika,c.order_, r.order_,(select count(1) from object where blok<>2 and id_rubrika=r.id_rubrika) as count_ from rubrika r ,categ c
where r.id_categ=c.id_categ 

Результат 0,094s
PM MAIL   Вверх
skyboy
Дата 5.3.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(sanich_ @  5.3.2008,  14:07 Найти цитируемый пост)
(не много модифицировал т.к. не показывались рубрики у которых небыло объявлений)

зря модифицировал.
попробуй один. с inner join, а не left join.

Добавлено через 50 секунд
а нужно будет с рубриками без объявлений - добавишь через union.
PM MAIL   Вверх
SelenIT
Дата 5.3.2008, 17:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 9
Всего: 401



sanich_,
1) Зачем джойнить таблицу categ?
2) Можно увидеть структуру таблиц и EXPLAIN самого первого запроса?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1109 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.